Сложные условия в bash, где оценивается возвращаемое значение исполняемых файлов - PullRequest
0 голосов
/ 14 ноября 2018

Мы можем сделать несколько сложных операторов условий в скобках типа [[ ]] или (( )).

например:

a=3;b=4;c=4
if [[ 1 == 1 && ( ( $a == $b && 1 == 1 ) || ( $b == $c && 2 == 2)) ]]; 
then echo yes; 
else echo no; 
fi

если мы рассмотрим эквивалент этого с использованием исполняемых команд, которые возвращают ошибку, я не уверен, что делать дальше. В случае цепочки 'и' это тривиально:

if echo hello | grep -q "h" && stat /etc/os-release 2>/dev/null; 
then echo yes; 
else echo no; 
fi  

Что если у меня есть несколько веток? как в первом примере, который я привел.

Вопрос по сути сводится к тому, как мне создавать группы команд? Скобки, которые я использовал в первом условии, похоже, работают только внутри блока [[ ]].

В качестве дополнительного вопроса, мой подход здесь глуп? Я знаю, что могу делать то, что хочу, с кучей утверждений «если», но я подумал, что это будет выглядеть ужасно.

Суть того, что я пытаюсь сделать, состоит в том, чтобы выполнить серию проверок, которые должны выполняться последовательно и с одной ветвью, на основе оценки переменной.

Большое спасибо

1 Ответ

0 голосов
/ 14 ноября 2018

Что если у меня есть несколько веток?

if [[ 1 == 1 && ( ( $a == $b && 1 == 1 ) || ($b == $c && 2 == 2) ) ]];

Для пояснения, здесь нет (( )) "типовых" скобок здесь, т.е.здесь не происходит арифметического расширения, а встроенная функция let не выполняется.Теперь давайте заменим 1 == 1 на true и $a == $b на "cmd1" и $b == $c на cmd2, мы можем:

if true && { { cmd1 && true; } || { cmd2 && true; }; }; then

С руководство по bash , выесть два способа группировать команды:

()
(список)
Размещение списка команд в скобках приводит к созданию среды подоболочки (см. Среда выполнения команд), и каждыйкоманд в списке, которые будут выполнены в этой подоболочке.Поскольку список выполняется в подоболочке, назначения переменных не остаются в силе после его завершения.

{}
{list;}
Помещение списка команд в фигурные скобки приводит к тому, что список выполняется в текущем контексте оболочки.Никакая подоболочка не создана.Требуется следующий список точек с запятой (или новой строки).

Нет синтаксической разницы между условием в условии if и выражением внутри предложения then .. fi - оба являются выражениями и анализируются как команды bash.Таким образом, вы можете вкладывать их:

if
    if true; then
        cmd1
    else
        cmd2
    fi
then
    cmd3
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...