web-dev-qa-db-ja.com

スクリプト内の拡張グロビング-何が問題なのですか?

そのため、インタラクティブなスクリプトを使用してファイルの範囲を選択しようとしています。

最終目標は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

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

2
Eike

変数だけでなく、配列割り当てを使用できます。

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 Shellオプションを追加し、一致するパターンがない場合はゼロ以外で終了します。

1
Jetchisel