2012-04-28 12 views
6

bashのファイルテスト式について質問があります。ここに私の質問を説明するための簡単なスクリプトです:bash:ファイルテスト式の評価の倍精度vs単一括弧

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です。

Iはif [[ -e $var1 ]]、即ち、二重括弧の代わりに単一を使用する場合、動作は正しい:あっても第3のケースで、Iはfile not foundを得ます。

私はset -xをファイルの先頭に貼り付けて、何が起こっていたのかを確認しました。単一のブラケットの場合、変数は'[' -e ']'と評価されます。 doubleでは、[[ -e '' ]]と評価されます。これは面白い。 2つのケースで表現が異なって評価されるのはなぜですか?

私は説明に感謝します。申し訳ありませんが私は明白な行方不明です。ありがとう!

答えて

3

これは機能するためです。 はtestよりもスマートで、shとの厳密な互換性が必要な場合を除いて使用してください。

+3

おかげイグナシオの詳細を見つけることができます。あなたの返信に基づいて私はいくつかの検索を行い、このリンクを見つけました:[link](http://mywiki.wooledge.org/BashFAQ/031)多く説明しました。 – verbose

+1

greycatのサイトは素晴らしいです。深刻なbashスクリプトライターのための必要な読書。 –

+4

私はテストに有利に使用されるべきであるとの主張に強く同意します。「[[[あなたのスクリプトを最小限に抑える必要があることが絶対に確かな場合にのみ使用してください。シェル。' –

6

変更

if [ -e "$var1" ]にあなたは[][[ ]]Here

関連する問題