LINUX.ORG.RU

Группировка логических условий в bash

 


0

2

Добрый день.

true && status="pravda"|| false && status="nepravda";echo $status
Я предполагал, что status будет равен pravda, рассуждая, что все, что после ||, не выполнится. Однако значение status=nepravda. Почему? Если взять все, что после || в круглые скобки (), то работает, как надо, однако, как я понимаю это плодит новый шелл. В фигурных скобках {} такая конструкция работать отказывается.

Как сгруппировать список команд, которые нужно выполнить в случае неудачного выполнения первого списка команд? Пожалуйста, помогите.

P.S.

true && status="pravda"|| true && status="nepravda";echo $status
status=nepravda. Тоже.

Такое ощущение, что второй && реагирует как-то криво.



Последнее исправление: rusya_rr (всего исправлений: 2)

Не знаю конкретного ответа на твой вопрос, но посоветую:

  1. избавиться от таких сложных логических условий
  2. При необходимости использовать if:
    command1 && command2
    # эквивалентно
    if command1 ; then
        command2
    fi
    В твоём случае может выглядеть так:
    if true; then
        status="pravda"
    elif false; then
        status="nepravda"
    fi 
    echo $status
    
KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от KennyMinigun

Спасибо за ответ. Но хочу разобраться.

rusya_rr
() автор топика

Если взять все, что после || в круглые скобки (), то работает, как надо, однако, как я понимаю это плодит новый шелл

Да, и работает не как надо. Попробуй:

unset status; (true && status="pravda") || (false && status="nepravda");echo $status

В фигурных скобках {} такая конструкция работать отказывается.

надо так:

{ true && status="pravda"; } || { false && status="nepravda"; }; echo $status

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

Работает, спасибо! Ну кто мог знать про точку с запятой?

rusya_rr
() автор топика
Ответ на: комментарий от KennyMinigun

Дык ить там вообще надо:

r@gru:~$ true && status="pravda"|| status="nepravda";echo $status
pravda
r@gru:~$ false && status="pravda"|| status="nepravda";echo $status
nepravda

anonymous
()
Ответ на: комментарий от anonymous

Вроде как, то, что после точки с запятой выполнится независимо от условий.

rusya_rr
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.