web-dev-qa-db-ja.com

一致するものがない場合のbash *一致の処理方法は?

次のbashスニペットは、ディレクトリに実際に*.txtファイルがある場合にうまく機能します。

for txt in *.txt
do                                               
  echo "loading data from $txt"
done   

ない場合、リテラル*.txtは$ txtとしてループに分類されます(良くありません)

*.txtファイルがない場合に、do ... doneブロックがスキップされるようにこのコードを変更するにはどうすればよいですか?

8
kfmfe04

グーグルがこれに対する答えを持っていたように見えます。

この魔法の呪文をforステートメントの前に置きます。

shopt -s nullglob
9
kfmfe04

Nullglobオプション(@ kfmfe04の回答)は、bash(ブランドXシェルではない)を使用している場合に最適であり、nullglobの変更や破損について心配する必要はありません。それ以外の場合は、次の(少し厄介な)オプションを使用できます。

for txt in *.txt
do
  [ -e "$txt" ] || continue
  echo "loading data from $txt"
done

これにより、存在しないファイル(一致するものがない場合は主に「* .txt」がスキップされますが、forがリストを生成してからループがそれらに到達するまでの間に削除されたファイルもスキップされる可能性があります。 。)

5
Gordon Davisson