Другое поведение оператора if в bash

grep 'time=' pingoutput.txt | awk '{print $8}'
3
09.07.2017, 02:15
2 ответа

Скобки в утверждениях типа [ "$foo" ]являются своего рода сокращением для команды test, , т. е.[ "$foo" ]и test "$foo"эквивалентны.

С другой стороны, простой ввод пробела или неустановленной строки возвращает trueкод выхода:

unset foo; $foo; echo $?
0

Сравните с:

unset foo ; test $foo ; echo $?
1
0
27.01.2020, 21:21

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.

3
27.01.2020, 21:21

Теги

Похожие вопросы