Способ выполнения нескольких операторов в выражении 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