Вы можете сделать это с помощью 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}'`
В сценарии оболочки говорится
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
будет выполняться, только если оба предыдущих теста пройдены успешно.
тл;др
Как указано в ответ, который у вас уже есть , согласно определению И перечисляет на командном языке оболочки, [ ! -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"
, которая, опять же, не создает проблем с порядком выполнения.