Bash:ワイルドカードとファイル条件

Bash:ワイルドカードとファイル条件

ファイルが存在することを確認しようとしています。期待どおりに動作します。

if [ -e "/tmp/test.*.lock" ]; then
  echo "exists!"
fi

以下は行われません。

if [[ -e /tmp/test.*.lock ]]; then
  echo "exists!"
fi

ファイル名は /tmp/test.123.lock と同じにできます。

「[[」バージョンで動作させる方法が見つかりません。誰かが理由とそのしくみを説明できますか?

答え1

[[ユーザージェノイドが正しい。式ではパス名拡張は行われません。

Bashのマニュアルページから:

[[ expression ]]
条件式の評価に応じて、0または1の状態を返します。表現は、以下に説明する基本色で構成されていますCONDITIONAL EXPRESSIONS[[と間の単語に対してトークン化とパス名拡張を実行しないでください。]];チルダ拡張、パラメータおよび変数拡張、算術拡張、コマンド置換、プロセス置換、および引用符の削除を実行します。このような条件付き演算子をデフォルトの-f演算子として認識するには、引用符を解く必要があります。

(強調は私のもの)

テストを使用するには、[[実際のテストの前に拡張を行う必要があります。これは、生成されたファイル名を格納する配列を使用して行うことができます。

以下は2つの例です。 1つ目は一致するファイルをテストし、2つ目は少なくとも1つの一致するファイルをテストし、一致するファイルが見つかった場合はループを終了します。

files=( /tmp/test.*.lock )

# test if exactly one file matches
if [[ "${#files[@]}" -eq 1 ]] && [[ -e "${files[0]}" ]]; then
  echo "file ${files[0]} exists!"
fi

# test if at least one file matches
for f in "${files[@]}"; do
  if [[ -e "$f" ]]; then
    echo "at least one file exists!"
    break
  fi
done

式の変数の周りに引用符は必要ありませんが、[[そうしても問題にならず、置き換えることができ[[ます[。ロックファイルが通常のファイルの場合は代わりに-f

答え2

[はコマンド(実際には他のコマンドと/usr/bin/[同様に最適化されたシェル組み込み)なので、それに続くすべてのエントリは他のコマンドと同様にファイル名拡張を受けます。echoprintf

[[bash キーワードです。括弧内ではファイル拡張が行われていないようです(ただし、bashリファレンスマニュアルではこれに関する情報は見つかりません)。

関連情報