スクリプトに問題はありませんが、最新のビルトインを使用してより良いスタイルで記述できることと、テキスト ファイルがない場合に失敗することを除いては、以下を参照してください。
echo "Checking for text files..."
j=0
for i in *.txt; do
echo "$i"
((++j))
done
if ((j!=0)); then
echo "No. of Text files: $j"
else
echo "No Text files."
fi
グロビングを使用する場合は、常にいずれかを使用するnullglob
ことをお勧めしますfailglob
。
failglob
グロブを展開できない場合はエラーが発生します。
nullglob
適切な拡張がない場合は、何も拡張されません。
これらがないと、適切な展開がない場合に (verbatim)*.txt
に展開され*.txt
ます。これはまさに回避したいことです!
あなたの場合、ちょうど置く
shopt -s nullglob
をスクリプトの先頭に追加すれば完了です。
*.txt
ファイルの数を数える方法としては、次のようなものがあります。
shopt -s nullglob
a=(*.txt)
echo "There are ${#a[@]} text files"
この大騒ぎは何nullglob
ですかfailglob
?
スクラッチディレクトリに行きましょう:
$ mkdir scratch; cd scratch
$ # this dir is empty
$ echo *.txt
*.txt
$
グロブには適切な展開がないためです。今:
$ shopt -s nullglob
$ echo *.txt
$
のためnullglob
。次に、設定を解除nullglob
して設定しfailglob
ます。
$ shopt -u nullglob
$ shopt -s failglob
$ echo *.txt
bash: no match: *.txt
$
それを得る?
要点は次のとおりです。bash でグロビングを使用するたびに、またはを使用してスクリプトをより堅牢にします。failglob
nullglob
頬の要点の舌として:またはなしでグロビングを使用するたびに、神は子猫を殺します。failglob
nullglob
shopt
およびシェルのオプションの動作に関する詳細が必要な場合は、マニュアルの The Shopt Builtin セクションを参照してください。