У меня есть вопрос о выражениях проверки файлов в bash. Вот простой сценарий, иллюстрирующий мой вопрос.:
set -x
read -p "Enter a filename: " var1
if [ - e $var1 ]
then
echo file exists
else
echo file not found
fi
Есть три сценария.:
foo
, который представляет собой файл, существующий в каталоге, из которого я запускаю сценарий. Как и ожидалось, результат будет file exists
.bar
. В каталоге, из которого я запускаю скрипт, такого файла нет. Как и ожидалось, результат будет file not found
.<enter>
, ничего не набрав. Удивительно, но на выходе file exists
.Если я использую if [[ -e $var1 ]]
, то есть двойные скобки вместо одинарных, поведение будет правильным :даже в третьем случае, я получаю file not found
.
Я поставил set -x
вверху файла, чтобы посмотреть, что происходит. С одинарными скобками переменная оценивается как:'[' -e ']'
. С двойным,оценивается как [[ -e '' ]]
. Это интересно. Почему выражение оценивается по-разному в двух случаях?
Буду признателен за пояснение. Извините, если я упускаю очевидное. Спасибо!