コマンドラインからcpを実行しましたが、スクリプト内のファイルが見つかりませんでした。

コマンドラインからcpを実行しましたが、スクリプト内のファイルが見つかりませんでした。

以下を含むディレクトリ構造を再構成するスクリプトがあります。

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"/

関連情報