Bashコマンドと変数置換の混乱

Bashコマンドと変数置換の混乱

私は1989年以来、コマンドラインから1行のbashスクリプトを書いてきました。これらのスクリプトの形式は通常次のとおりです。

for name in 1 2 3; do wc $name.txt; done

私は2つのファイル名をパラメータとして使用するスクリプトを使用して、GIMPを使用していくつかの画像処理を実行しようとしています。有効なコマンドラインを提供する内容は次のとおりです。

/Applications/GIMP.app/Contents/MacOS/GIMP -b '(script-fu-overlay "png0004.tif" "png0000.tif") (script-fu-overlay "png0004.tif" "png0001.tif") (script-fu-overlay "png0004.tif" "png0002.tif") (script-fu-overlay "png0004.tif" "png0003.tif")'

これは、一般的なシングルライナーの助けを借りて作成されます。

X=\'$(for name in 0 1 2 3; do echo \(script-fu-overlay \"png0004.tif\" \"png000$name.tif\"\) ; done)\'

しかし…私の質問はこんな感じです。

echo /Applications/GIMP.app/Contents/MacOS/GIMP -b $X

上記の正確なコマンドラインを提供しますが、実行すると

/Applications/GIMP.app/Contents/MacOS/GIMP -b $X

引用符でファイル名を開くことができないというエラーが発生しますが、実行すると

/Applications/GIMP.app/Contents/MacOS/GIMP -b "$X"

すべてが正常です。私の実際の目標は、変数をまったく使用せずに1行のステートメントを作成できることを確認することです。それは次のとおりです。

/Applications/GIMP.app/Contents/MacOS/GIMP -b \'$(for name in 0 1 2 3; do echo \(script-fu-overlay \"png0004.tif\" \"png000$name.tif\"\) ; done)\'

しかし、これは明らかに同じ方法で失敗します

/Applications/GIMP.app/Contents/MacOS/GIMP -b $X

失敗する。

ベストアンサー1

はい、シェル変数を使用せずにコマンドラインでこれを実行できます。

/Applications/GIMP.app/Contents/MacOS/GIMP -b "$(for name in 0 1 2 3; do echo \(script-fu-overlay \"png0004.tif\" \"png000$name.tif\"\) ; done)"

evalここでは、単一引用符をエスケープしないため、エスケープ処理をオフにする必要があります。必要な唯一のことは、コマンドが$(...)の周りの二重引用符を拡張して単語の分割が発生するのを防ぎ、結果を引数として渡すことですgimp

おすすめ記事