これは簡単だと思っていましたが、予想よりも複雑であることが判明しています。
ディレクトリ内の特定の種類のすべてのファイルを反復処理するため、次のように記述します。
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
これは、ディレクトリに一致するファイルが少なくとも1つある限り機能します。しかし、一致するファイルがない場合、私はこれを取得します:
current file is *.zip
次に試しました:
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
ファイルがない場合、ループの本体は実行されませんが、lsからエラーが発生します。
ls: *.zip: No such file or directory
一致するファイルをまったく処理しないループを作成するにはどうすればよいですか?
FILES=
のls * .zipファイル; for fname in "${FILES}"...
が、と期待どおりに作業を行うfor fname in *.zip ; do....
for file in *.zip
ではなくを使用し`ls ...`
ます。@cuonglmの提案では*.zip
、パターンがどのファイルにも一致しない場合は何も展開されません。ls
引数なしでは、現在のディレクトリがリストされます。
shopt -s nullglob
forループを実行する前に追加します。