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つのシナリオがあります。
- 私は
foo
を入力し、プロンプトで、私はそこからディレクトリに存在するファイルでありますスクリプトを実行します。予想通り、出力はfile exists
です。 - プロンプトで、
bar
と入力します。スクリプトを実行しているディレクトリにそのようなファイルはありません。期待どおり、出力はfile not found
です。 - プロンプトで何も入力せずに
<enter>
を押しました。驚くべきことに、出力はfile exists
です。
Iはif [[ -e $var1 ]]
、即ち、二重括弧の代わりに単一を使用する場合、動作は正しい:あっても第3のケースで、Iはfile not found
を得ます。
私はset -x
をファイルの先頭に貼り付けて、何が起こっていたのかを確認しました。単一のブラケットの場合、変数は'[' -e ']'
と評価されます。 doubleでは、[[ -e '' ]]
と評価されます。これは面白い。 2つのケースで表現が異なって評価されるのはなぜですか?
私は説明に感謝します。申し訳ありませんが私は明白な行方不明です。ありがとう!
おかげイグナシオの詳細を見つけることができます。あなたの返信に基づいて私はいくつかの検索を行い、このリンクを見つけました:[link](http://mywiki.wooledge.org/BashFAQ/031)多く説明しました。 – verbose
greycatのサイトは素晴らしいです。深刻なbashスクリプトライターのための必要な読書。 –
私はテストに有利に使用されるべきであるとの主張に強く同意します。「[[[あなたのスクリプトを最小限に抑える必要があることが絶対に確かな場合にのみ使用してください。シェル。' –