スクリプト内の拡張グロブ - 何が間違っているのでしょうか?

スクリプト内の拡張グロブ - 何が間違っているのでしょうか?

そこで、対話型スクリプトを使用してファイルの範囲を選択しようとしています。

最終目標はコマンドを使用することですが、ここではデモンストレーションのために変数を手動でread割り当てましたglob

#!/bin/bash
shopt -s extglob
# read -rp "Please enter a globbing string:"$'\n' glob

# This will give me an error (See below)
glob=*2020_04_03_{06..18}.jpg
/bin/ls -la /mnt/drive1/images/*/*/${glob}

# While this will return the desired files
/bin/ls -la /mnt/drive1/images/*/*/*2020_04_03_{06..18}.jpg

エラーは次のとおりです:

Error /bin/ls: cannot access "/mnt/drive1/images/*/*/*2020_04_03_{06..18}.jpg": No such file or directory

globでは、変数を割り当てたり、globパスに変数を追加したりする際に何が欠けているのでしょうか?

解決:

解決策は見つかりましたが、その理由はよくわかりませんが

bash <<EOF
/bin/ls -la /mnt/drive1/images/*/*/${glob} 
EOF

希望する出力が得られます。

答え1

単なる変数の代わりに配列の割り当てを使用できます。

shopt -s nullglob  ##: just in case there is non match for the glob.

glob=(*2020_04_03_{06..18}.jpg) ##: This will expand the glob * and brace expansion.

/bin/ls -la /mnt/drive1/images/*/*/"${glob[@]}"
  • それはサンプルコードでは機能するはずです。

  • 問題は、中括弧展開内の数字を、展開の順序について @kusalananda が言及した変数に置き換えることにしたときに発生します。

  • failglobエラーを表示し、一致するパターンがない場合にはゼロ以外の値で終了する場合は、シェル オプションを追加します。

関連情報