入力文字列がファイル名を参照していることを確認したいと思います。いいえワイルドカード文字列*.txt
(例:
これはうまくいきません:
if [ -f "$1" ];
$1
に拡張される*.txt
とに拡張されるためににfoo.txt bar.txt
渡されますtest -f
。
ワイルドカードを明示的に確認するだけでなく、シェル置換を実行してワイルドカードを防ぐ一般的な方法はありますか?
答え1
いいえ、地球はいいえ見積もりを拡張すると、次のようになります。
set -- '*.txt'
[ -f "$1" ]
現在のディレクトリから呼び出されたファイルが通常ファイルか*.txt
一般ファイルへのシンボリックリンクであることを確認します。
[ -f $1 ]
これは問題になります($1
単語の分割(ここではデフォルトでは何もしません$IFS
)とファイル名の生成を行います)。
拡張子を持つ通常のファイルが存在することを確認するには、.txt
ループ、使用、find
またはzsh
glob修飾子が必要です。
set -- *.txt
for f do
if [ -f "$f" ]; then
echo "there is at least one regular file with a .txt extension here"
fi
done
または、パターンが次に見つかった場合$1
:
IFS= # disable the splitting part of the split+glob operator
set -- $1
for f do... # as above
zsh
:
files=(*.txt(N-.))
echo "$#files regular files with a .txt extension here"
find
:
find -L . ! -name . -prune ! -name '.*' -name '*.txt' -type f | grep -q . &&
echo there are regular .txt files in here