Способ выполнения нескольких операторов в выражении bash test &&

Кто-нибудь знает способ выполнения нескольких операторов в тесте bash? Поэтому, если я использую:

[[ $Var = 1 ]] && echo "yes-1" || echo "no-1"

И установите Var=1, затем выведите: yes-1
Если я устанавливаю Var=2, тогда вывод: no-1

И эта работа, как я и ожидал. Но если я попытаюсь добавить еще один оператор для выполнения в миксе, и он не работает:

[[ $Var = 1 ]] && echo "yes-1";echo "yes-2" || echo "no-1";echo "no-2"

Что имеет смысл, так как bash видит команду, заканчивающуюся на; но... это не то, что я хочу.

Я пробовал группировку, оценки и функции, имел неудачи и успехи, но я бы просто хотел, чтобы эта работа работала в одной строке. У кого-нибудь есть идеи?

Ответ 1

Простая группировка команд должна работать; синтаксис может быть немного сложным, хотя.

[[ $Var = 1 ]] && { echo "yes-1"; echo "yes-2"; } || { echo "no-1"; echo "no-2"; }

Несколько замечаний:

  • Посоветуйте @tvm советы об использовании инструкции if-then-else, если вы сделаете что-то более сложное.

  • Каждая команда внутри фигурных скобок должна быть завершена с помощью двоеточия, даже последней.

  • Каждая фигурная скобка должна быть отделена от окружающего текста пробелами с обеих сторон. Скобки не вызывают разрывы слов в bash, поэтому "{echo" - это одно слово, "{эхо" - это скобка, за которой следует слово "эхо".

Ответ 2

Рассмотрим использование регулярного оператора IF THEN ELSE. Использование && и || оправдан в простом тесте, таком как:

[[ -z "$PATH" ]] && echo 'Disaster, PATH is empty!' || echo 'Everything ok!'

Но рассмотрите следующую команду:

true && true && true && false && true || echo 'False!'
False!

ИЛИ

true && { echo true; false ; } || { echo false; true ; }
true
false

В любое время возвращается ненулевой статус выхода, команда после || выполняется. Как вы можете видеть, даже командная группировка не помогает.

Выполнение в подоболочке ведет себя аналогичным образом:

true && ( true; echo true; true; false ) || ( true; echo true; false )
true
true

Просто используйте регулярные IF, если вам нужно правильное поведение IF.

Ответ 3

Использовать подоболочки:

$ Var=1; [[ $Var = 1 ]] && ( echo "yes-1";echo "yes-2" ) || ( echo "no-1";echo "no-2"; )
yes-1
yes-2

$ Var=2; [[ $Var = 1 ]] && ( echo "yes-1";echo "yes-2" ) || ( echo "no-1";echo "no-2"; )
no-1
no-2