bash :двойные и одинарные скобки в оценке выражения проверки файла

У меня есть вопрос о выражениях проверки файлов в bash. Вот простой сценарий, иллюстрирующий мой вопрос.:

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

Есть три сценария.:

  1. В командной строке я ввожу foo, который представляет собой файл, существующий в каталоге, из которого я запускаю сценарий. Как и ожидалось, результат будет file exists.
  2. В командной строке я ввожу bar. В каталоге, из которого я запускаю скрипт, такого файла нет. Как и ожидалось, результат будет file not found.
  3. В командной строке я нажал <enter>, ничего не набрав. Удивительно, но на выходе file exists.

Если я использую if [[ -e $var1 ]], то есть двойные скобки вместо одинарных, поведение будет правильным :даже в третьем случае, я получаю file not found.

Я поставил set -xвверху файла, чтобы посмотреть, что происходит. С одинарными скобками переменная оценивается как:'[' -e ']'. С двойным,оценивается как [[ -e '' ]]. Это интересно. Почему выражение оценивается по-разному в двух случаях?

Буду признателен за пояснение. Извините, если я упускаю очевидное. Спасибо!

6
задан verbose 28 April 2012 в 04:54
поделиться