以下を含むディレクトリ構造を再構成するスクリプトがあります。
files=./*"$pattern"I{"$ifirst".."$ilast"}.ext
cp ${files} ../"$pattern"/"$i"/
スクリプトを実行するとエラーが発生します。
./*S6I{001..129}.ext: No such file or directory
ただし、コマンドをエコーしてから端末にコピーして貼り付けると、予期した動作が表示されます。
cp ./*S6I{001..129}.ext ../S6/1/
スクリプトでこれが正しく実行されないのはなぜですか?
答え1
拡張順序のため、スクリプトは期待どおりに機能しません。
Bashのマニュアルから:
拡張順序は、中かっこ拡張、パラメータと変数拡張、算術拡張、コマンドの置換(左から右へ)です。
ご覧のとおり、中かっこ拡張が最初に来、変数拡張が最後に来ます。課題では中括弧の拡張は行われません。それ以外の場合、式はx={1,2}
拡張され、x=1 x=2
これも意味がありません。
ご存知のように、解決策の1つは、完全なeval
拡張が2回行われるため、最初の変数拡張が2番目の中括弧拡張の前に実行されることです。
危険を理解したことを確認し、eval
特に信頼できない入力には絶対に使用しないでください。
Bashでは、配列を使用できます。
files=( ./*"$pattern"I{"$ifirst".."$ilast"}.ext )
cp "${files[@]}" ../"$pattern"/"$i"/