forループグローブ事故

forループグローブ事故

ディレクトリセットを繰り返しながら.jpgファイルが見つかった場合は1つのタスクを実行し、.nefファイルが見つかった場合は別のタスクを実行するスクリプトを設定しようとしています。問題は、ディレクトリに.jpgファイル(または.nef)がない場合は、globエントリが拡張されたglobではなく単に文字列であることです。たとえば、

my_dir="pictures/"
ext="JPG"
for f in "$my_dir"*."$ext"; do
    echo $f
done

my_dirフォルダに.JPGファイルが含まれている場合は、コマンドラインに正しく表示されます。

pictures/one.JPG
pictures/two.JPG

ただし、my_dir に .JPG ファイルがない場合、ループは 1 回の反復を入力してエコーされます。

pictures/*.JPG

globに一致するものがない場合、forループに入らないようにこれをどのように設定しますか?

ベストアンサー1

これは一般的なデフォルト動作です。ワイルドカードがファイル/ディレクトリと一致できない場合、元のワイルドカードは保持されます。

空の結果を返すには、nullglob次のようにスクリプトでこのオプションを設定できます。

$ shopt -s nullglob
$ for f in "$my_dir"*."$ext"; do echo $f; done
$

後で次の方法で無効にできます。

$ shopt -u nullglob

おすすめ記事