7

コマンドライン引数に基づいて散布図を生成するプログラムをIDLで作成しました。私はこのようにターミナルで直接プログラムを正常に呼び出すことができます:

idl -e "scatterplot_1_2d_file.pro" $ infile $ outfile $ title $ xtitle $ ytitle $ xmin $ xmax $ ymin $ ymax $ timescale

$ *は、入力された文字列リテラルを指します。問題は、その行を文字列の代わりに変数名を入力してbashスクリプトに入力し、100万の散布図を生成できると思ったということです。私が休憩している間。残念ながら、そのようにすると、次のエラーが発生します。

idl:-eオプションはバッチファイルでは指定できません

したがって、次の試みは、これらのコマンドをIDLバッチファイルに書き込んでから実行することでした。

その試みは次のようになります。

#!/bin/bash

indir=/path/to/indir/
outdir=/path/to/outdir/

files=`ls $indir`
batchfile=/path/to/tempbatchfile.pro

echo .r "/path/to/scatterplot_1_2d_file.pro" >> $batchfile

for file in $files
  do
  name=${file%\.*}
  echo scatterplot_1_2d_file $indir$name.txt $outdir$name.jpg $name "Gauge Precipitation (mm)" "NMQ Precipitation (mm)" "*" "*" "*" "*" 2 >> $batchfile
done #done file                                                                                                                                                                                                

echo exit >> $batchfile

idl <<EOF                                                                                                                                                                                                      
@/path/to/scatterplot_1_2d_file                                                                                                                                                                  
EOF                                                                                                                                                                                                            

rm $batchfile

スクリプトが生成するエラーの大部分が関連しているかどうかはわかりません。そのため、最初の部分を投稿し、必要に応じて残りの部分を後で投稿します。

[foo]$ bash script_thing.sh
IDL Version 6.3 (linux x86 m32). (c) 2006, Research Systems, Inc.
Installation number: 91418.
Licensed for personal use by XXXXXXXXX only.
All other use is strictly prohibited.


PRO scatterplot_1_2d_file
                         ^
% Programs can't be compiled from single statement mode.
  At: /path/to/scatterplot_1_2d_file.pro, Line 1
% Attempt to subscript ARGS with <INT      (       1)> is out of range.
% Execution halted at: $MAIN$          
% Attempt to subscript ARGS with <INT      (       2)> is out of range.
% Execution halted at: $MAIN$          
% Attempt to subscript ARGS with <INT      (       3)> is out of range.
% Execution halted at: $MAIN$          
% Attempt to subscript ARGS with <INT      (       4)> is out of range.
% Execution halted at: $MAIN$          
% Attempt to subscript ARGS with <INT      (       5)> is out of range.
% Execution halted at: $MAIN$          
% Attempt to subscript ARGS with <INT      (       6)> is out of range.
% Execution halted at: $MAIN$          
% Attempt to subscript ARGS with <INT      (       7)> is out of range.
% Execution halted at: $MAIN$          
% Attempt to subscript ARGS with <INT      (       8)> is out of range.
% Execution halted at: $MAIN$          
% Attempt to subscript ARGS with <INT      (       9)> is out of range.
% Execution halted at: $MAIN$          

できないことをやろうとしているだけなのかはわかりませんが、見た目は良くありません。何かアドバイス?

4

2 に答える 2

7

COMMAND_LINE_ARGSこれには 2 つの方法があります。有効な IDL ルーチン呼び出しを使用または作成します。このルーチンは、次の両方を使用します。

pro test, other_args
  compile_opt strictarr

  args = command_line_args(count=nargs)

  help, nargs
  if (nargs gt 0L) then print, args

  help, other_args
  if (n_elements(other_args) gt 0L) then print, other_args
end

次の 2 つの方法のいずれかで、コマンド ラインから呼び出します。

Desktop$ idl -e "test" -args $MODE
IDL Version 8.2, Mac OS X (darwin x86_64 m64). (c) 2012, Exelis Visual Information Solutions, Inc.
Installation number: 216855.
Licensed for use by: Tech-X Corporation

% Compiled module: TEST.
NARGS           LONG      =            1
test
OTHER_ARGS      UNDEFINED = <Undefined>
Desktop$ idl -e "test, '$MODE'"
IDL Version 8.2, Mac OS X (darwin x86_64 m64). (c) 2012, Exelis Visual Information Solutions, Inc.
Installation number: 216855.
Licensed for use by: Tech-X Corporation

% Compiled module: TEST.
NARGS           LONG      =            0
OTHER_ARGS      STRING    = 'test'
test
于 2012-06-23T15:16:03.810 に答える
4

IDL についてはわかりませんが、役立つ可能性がある Bash スクリプトの修正を次に示します。

#!/bin/bash

indir=/path/to/indir/
outdir=/path/to/outdir/

# (commented out) files=`ls $indir` # no, just no
batchfile=/path/to/tempbatchfile.pro

echo ".r /path/to/scatterplot_1_2d_file.pro" > "$batchfile"  # overwrite the file on the first write, put everything inside the quotes

for file in "$indir/"*
    do
    name=${file%\.*}
    echo "scatterplot_1_2d_file $indir$name.txt $outdir$name.jpg $name Gauge Precipitation (mm) NMQ Precipitation (mm) * * * * 2" # quote the whole thing once, it's simpler and echo doesn't do anything differently
done >> "$batchfile" # do all the output from the loop
echo exit >> "$batchfile"

# *** where does idl learn the location of "$batchfile"? ***
idl <<EOF                                                                                                                                                                                                      
@/path/to/scatterplot_1_2d_file                                                                                                                                                                  
EOF                                                                                                                                                                                                            

rm "$batchfile"

コマンド ラインのバージョンを修正するには、引用符を使用します。

idl -e "scatterplot_1_2d_file.pro" "$infile" "$outfile" "$title" "$xtitle" "$ytitle" "$xmin" "$xmax" "$ymin" "$ymax" "$timescale"

変数を展開するときは、常に変数を引用してください。

于 2012-06-23T11:30:49.267 に答える