次のbashスニペットは、ディレクトリに実際に*.txt
ファイルがある場合にうまく機能します。
for txt in *.txt
do
echo "loading data from $txt"
done
ない場合、リテラル*.txt
は$ txtとしてループに分類されます(良くありません)
*.txt
ファイルがない場合に、do ... done
ブロックがスキップされるようにこのコードを変更するにはどうすればよいですか?
グーグルがこれに対する答えを持っていたように見えます。
この魔法の呪文をfor
ステートメントの前に置きます。
shopt -s nullglob
Nullglobオプション(@ kfmfe04の回答)は、bash(ブランドXシェルではない)を使用している場合に最適であり、nullglobの変更や破損について心配する必要はありません。それ以外の場合は、次の(少し厄介な)オプションを使用できます。
for txt in *.txt
do
[ -e "$txt" ] || continue
echo "loading data from $txt"
done
これにより、存在しないファイル(一致するものがない場合は主に「* .txt」がスキップされますが、for
がリストを生成してからループがそれらに到達するまでの間に削除されたファイルもスキップされる可能性があります。 。)