現在の作業ディレクトリで、文字「f」を含むすべてのファイル名を取得するために、次のコードを書きました。
for i in *
do
echo $i
if [ $i = "*f*" ]
then
echo "no"
else
echo "yes"
fi
done
ディレクトリ内のすべてのファイルに「f」が含まれているかどうかに関係なく、「yes」が印刷されます。助けてください。
ベストアンサー1
[ $i = "*f*" ]
変数に保存されているファイル名をi
スペースに基づいて別々の単語に分割し、各単語をワイルドカードパターンとして解釈し、一致する場合は展開し、結果の単語リストを次のように解析します[ … ]
。この面倒な作業を避けるために、代わりにファイル名を使用してください。変数拡張の周囲に二重引用符を追加する。
[ "$i" = "*f*" ]
変数のファイル名がi
3文字の名前であるかどうかをテストします*f*
。この名前のファイルが存在しない場合は、すべてのファイルがelseブランチをトリガーしてyes
印刷されます。
ksh、bash、またはzshでは、二重角括弧構成を使用して、文字列がワイルドカードパターンと一致するかどうかをテストできます。パターンのワイルドカード文字を引用符なしで残します。
if [[ "$i" = *f* ]]; then …
通常のshには二重括弧構文はありません。文字列がパターンと一致するかどうかをテストするには、case
コンストラクタを使用できます。
case "$i" in
*f*) echo "no";;
*) echo "yes";;
esac