Скобки в утверждениях типа [ "$foo" ]
являются своего рода сокращением для команды test
, , т. е.[ "$foo" ]
и test "$foo"
эквивалентны.
С другой стороны, простой ввод пробела или неустановленной строки возвращает true
код выхода:
unset foo; $foo; echo $?
0
Сравните с:
unset foo ; test $foo ; echo $?
1
result is true. But I don't understand why since bash will translate $anything to an empty string, shouldn't this will result in syntax error ?
Близко, но нет печенья. Есть выражение:$anything
. if ; then
является ошибкой, потому что bash не может проанализировать его (, следовательно,:синтаксис ошибка ). Он ожидает там список команд и вместо этого получает ;
. Синтаксический анализ происходит задолго до расширения переменных, поэтому if $anything; then
анализируется нормально. Что произойдет дальше? $anything
расширяется, выполняется разделение полей и т. д. Это оставляет пустой список команд, что тривиально верно. Сравните:
if "$anything"; then echo foo; fi
if $anything; then echo foo; fi
"$anything";
не является пустым списком команд, у него есть команда, которая происходит с пустой строкой, так же, как и с if '';
. Но "$anything"
без кавычек превращается в ничто.
То же самое было бы верно, если бы $anything
содержал только пробельные символы, присутствующие в IFS
,или содержал разделенный$IFS
-список глобусов, которые не соответствовали ни одному файлу, и была включена опция nullglob
.