"" по $1, почему bash ведет себя так?

если script имеет

if [ $1 == "-?" ]; then #line 4
 echo "usage: ...."
fi

когда script get запускается без какого-либо параметра, он будет жаловаться, что

./script.sh: line 4: [: ==: unary operator expected

но если вместо этого

if [ "$1" == "-?" ]; then #line 4
 echo "usage: ...."
fi

тогда все отлично

почему?

спасибо

2 ответа

Если первый аргумент отсутствует или пуст, ваш первый script имеет значение:

if [ == "-?" ] ; then

... который является синтаксической ошибкой. Как вы заметили, для предотвращения использования "" вам необходимо:

if [ "" == "-?" ] ; then

AFAIK это связано с тем, как работает оригинальная оболочка Борна. Вы должны сделать привычкой включать переменные в "", чтобы также корректно работать с аргументами, в которых есть пробелы. Например, если вы назовете ваш script следующим образом:

./myScript "first argument has spaces"

Тогда ваш первый script будет оценивать:

if [ first argument has spaces == "-?" ] ; then

который также является синтаксической ошибкой. Также такие вещи, как rm $1, не будут делать то, что вы хотите, если вы передадите имена файлов с пробелами. Вместо rm "$1".


Потому что [ заменяет значения перед выполнением. [[ не работает, так будет работать как ожидалось.

licensed under cc by-sa 3.0 with attribution.