ワイルドカードなしでシェル変数を拡張する

ワイルドカードなしでシェル変数を拡張する

入力文字列がファイル名を参照していることを確認したいと思います。いいえワイルドカード文字列*.txt(例:

これはうまくいきません:

if [ -f "$1" ];

$1に拡張される*.txtとに拡張されるためににfoo.txt bar.txt渡されますtest -f

ワイルドカードを明示的に確認するだけでなく、シェル置換を実行してワイルドカードを防ぐ一般的な方法はありますか?

答え1

いいえ、地球はいいえ見積もりを拡張すると、次のようになります。

set -- '*.txt'
[ -f "$1" ]

現在のディレクトリから呼び出されたファイルが通常ファイルか*.txt一般ファイルへのシンボリックリンクであることを確認します。

[ -f $1 ]

これは問題になります($1単語の分割(ここではデフォルトでは何もしません$IFS)とファイル名の生成を行います)。

拡張子を持つ通常のファイルが存在することを確認するには、.txtループ、使用、findまたはzshglob修飾子が必要です。

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

関連情報