私のbashスクリプトには次の内容があります
CMD="{ head -n1 $DATE.$FROMSTRAT.new && egrep -i \"$SYMS\" $DATE.$FROMSTRAT.new; } > $DATE.$TOSTRAT.new"
echo "Running $CMD"
`$CMD`
私がスクリプトを呼び出すとき
Running { head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new
script.sh: line 17: {: command not found
しかし、{ head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new
コマンドラインから実行すると正常に動作します。
脱出しようとしましたが{
失敗しました。どうすればいいですか?
ベストアンサー1
さて、コマンドラインでこれらの変数を使用すると単語に分割されますが、これは{
(または)などの構文エントリを解析した後に発生します。if
したがって、これが必要な場合は、次のものを使用する必要があります。eval
CMD="{ echo blah ; echo bleh; } > output"
eval "$CMD"
# output contains "blah" and "bleh"
eval
note は、変数の割り当てを含む現在のシェルの変数にあるすべてを実行します (IFS
たとえば、変更はスクリプトの残りの部分に興味深い影響を与える可能性があります)。bash -c "$CMD"
少なくとも変数割り当ての問題を軽減するために、別のシェルで実行できます。
また、バックティックはコマンドの出力をキャプチャしてコマンドラインで使用するために使用されるため、出力もコマンド$CMD
として実行されます。
$ CMD="echo foo"
$ `$CMD`
-bash: foo: command not found
出力をファイルにリダイレクトすることは重要ではありませんが、ほとんど必要ありません。