Каков порядок оценки предложений скрипта в bash?

Вы можете сделать это с помощью awk с помощью этой команды:

sum=`echo|awk -v y1=$y1 -v y2=$y2 '{print y1+y2}'`

Как было предложено в комментарии, awk можно переписать таким образом (, чтобы избежать эха)

sum=`awk -v y1=$y1 -v y2=$y2 'BEGIN {print y1+y2}'`
2
09.04.2019, 22:30
2 ответа

В сценарии оболочки говорится

if [ ! -z "$foo" ] && [ "$foo2" -eq 0 ]; then
    echo 'something'
fi

первый тест,[ ! -z "$foo" ](лучше записать как [ -n "$foo" ]), будет выполняться первым. Второй тест будет запущен только , если первый тест прошел успешно. Если оба теста успешны, то есть $fooявляется непустым значением, а $foo2имеет арифметическое значение, равное нулю, тогда будет выполнен echo.

Оператор &&работает аналогично аналогичным операторам в других языках. Оболочка реализует короткую -оценку схемы и будет оценивать правую часть &&только в том случае, если левая часть истинна .

Этот конкретный оператор ifтакже может быть написан без использования ключевого слова if, как

[ ! -z "$foo" ] && [ "$foo2" -eq 0 ] && echo 'something'

Хотя использование if...; then...; fiИМХО понятнее.

Опять же, echoбудет выполняться, только если оба предыдущих теста пройдены успешно.

7
28.04.2021, 23:34

тл;др

Как указано в ответ, который у вас уже есть , согласно определению И перечисляет на командном языке оболочки, [ ! -z "$foo" ]выполняется первым, а затем, только если он возвращает статус выхода равен нулю, [ "$foo2" -eq 0 ]выполняется.


Порядок выполнения команд в Bash указан в разделе «Команды оболочки» Справочного руководства по Bash . В дальнейшем я предполагаю, что приведенные там определения, возможно, дословно воспроизведены (, даже если они не оформлены в виде цитат, для удобства ).

Для Bash и других оболочек, совместимых с POSIX, более формальные (, но, вероятно, менее понятные )определения можно найти в главе «Язык команд оболочки» (, в частности, в параграфах «Команды оболочки» и «Команды оболочки». Грамматика» )из Базовых спецификаций Open Group .

В коде

if [ ! -z "$foo" ] && [ "$foo2" -eq 0 ]; then
    echo "something"
fi

у нас естьifсоставная команда , список И и три простые команды .

Общий синтаксис условной конструкции if:

if test-commands; then
    consequent-commands;
[elif more-test-commands; then
    more-consequents;]
[else alternate-consequents;]
fi

Если статус выхода test-commandsравен нулю, выполняется предложение consequent-commands.

Наше предложение test-commandsпредставляет собой список AND, который представляет собой последовательность конвейеров , разделенных &&, как в

command1 && command2

, где command2выполняется тогда и только тогда, когда статус выхода command1равен нулю.

Списки AND выполняются с левой ассоциативностью. Таким образом:

command1 && command2 && command3

выполняется так, как если бы оно было написано как (, используя круглые скобки в качестве операторов группировки псевдокода и временно забывая их значение в языке Bash):

(((command1) && command2) && command3)

В нашем списке AND

[ ! -z "$foo" ] && [ "$foo2" -eq 0 ]

первый трубопровод

[ ! -z "$foo" ]

выполняется первым. Только если он преуспеет во втором конвейере

[ "$foo2" -eq 0 ]

выполняется.Статус выхода последней выполненной команды в списке определяется if.

Конвейер представляет собой последовательность одной или нескольких команд, разделенных одним из управляющих операторов |или |&. Оба наших конвейера — это просто простые команды.

Простая команда — это последовательность слов, разделенных символом blanks, завершаемая одним из управляющих операторов оболочки. Простые команды не создают проблем с порядком выполнения.

Для записей простые команды в нашем списке AND состоят из (встроенной )команды [и четырех аргументов к ней, соответственно !, -z, "$foo", ]. ] и "$foo2", -eq, 0, ].

Наконец, пункт consequent-commandsнашей составной команды if— это простая команда echo "something", которая, опять же, не создает проблем с порядком выполнения.

2
28.04.2021, 23:34

Теги

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