6

bashのファイルテスト式について質問があります。これが私の質問を説明するための簡単なスクリプトです:

set -x
read -p "Enter a filename: " var1
if [ - e $var1 ]
then
    echo file exists
else
    echo file not found
fi

3つのシナリオがあります。

  1. プロンプトで foo、スクリプトを実行しているディレクトリに存在するファイルであると入力します。予想どおり、出力は file existsです。
  2. プロンプトで、と入力します bar。スクリプトを実行しているディレクトリにそのようなファイルはありません。予想どおり、出力は file not foundです。
  3. プロンプトで、 <enter> 何も入力せずにヒットしました。驚いたことに、出力は file existsです。

を使用する場合 if [[ -e $var1 ]]、つまり、単一ではなく二重括弧を使用する場合、動作は正しいです。3番目の場合でも、。を取得しfile not foundます。

set -x 何が起こっているのかを確認するために、ファイルの先頭にを貼り付け ました。角かっこが1つある場合、変数は次のように評価されます '[' -e ']'。doubleの場合、として評価され [[ -e '' ]]ます。これは面白い。2つのケースで式の評価が異なるのはなぜですか?

説明をいただければ幸いです。明らかなことを見逃してしまったらごめんなさい。ありがとう!

4

2 に答える 2

6

への変更if [ -e "$var1" ]

あなたはここでの詳細を見つけることができ[]ます[[ ]]

于 2012-04-28T06:13:47.227 に答える
3

それが彼らの働き方だからです。[[よりも賢くtest、厳密な互換性shが必要な場合を除いて使用する必要があります。

于 2012-04-28T05:13:11.117 に答える