Bash: запустить command2, если не удалось выполнить command1


43

Я хочу сделать что-то вроде этого:

if cmd1 && cmd2
echo success
else
echo epic fail
fi

как мне это сделать?


1
Вам просто не хватает ключевого слова then перед командой echo success.
Гленн Джекман

10
Хммм; Ваш псевдокод, похоже, задает другой вопрос, чем тот, который
указан

Хороший ресурс для некоторых условий сценариев оболочки выхода pixelbeat.org/programming/shell_script_mistakes.html
Flashman

Ответы:


71

Они должны делать то, что вам нужно:

cmd1 && cmd2 && echo success || echo epic fail

или

if cmd1 && cmd2; then
    echo success
else
    echo epic fail
fi

3
Это работает, но я запутался, почему ||не смотрит на вывод первой echoкоманды.
mlissner

1
@mlissner, if else ожидает выхода из кодов, 0, если команда была запущена и 1, если произошла ошибка. Не читайте на выходе. Just try whoami && whoami && echo success || echo epic failи сейчас whoami && whoareyou && echo success || echo epic fail. Я не могу понять, что вы подразумеваете под "не смотрит на вывод первой команды эха"
m3nda

@mlissner Думаю, я получил твой вопрос, но ответ таков: команда echo никогда не подведет. То есть его возвращение будет 0, т.е. правдивым. Итак, условие, которое действительно имеет значение, это простоcmd1 && cmd2
Казим Заиди

22

Петр Узел на месте, но вы также можете играть с магическим $ ?.

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

Этот вопрос немного затрагивает эту тему. Лучшая практика использования $? в баш? ,

cmd1 
if [ "$?" -eq "0" ]
then
  echo "ok"
else
  echo "Fail"
fi

Тогда вы также можете реагировать на разные коды выхода и делать разные вещи, если хотите.


1
Моя компания, PHP Experts, Inc., и я хочу поблагодарить вас за то, что вы стали неотъемлемой частью нашего внутреннего скрипта CI. Спасибо!
Теодор Р. Смит

7

Псевдокод в вопросе не соответствует названию вопроса.

Если кому-то действительно нужно знать, как запустить команду 2, если команда 1 не выполнена, это простое объяснение:

  • cmd1 || cmd2: Это будет работать cmd1, и в случае сбоя это будет работатьcmd2
  • cmd1 && cmd2: Это будет работать cmd1, и в случае успеха это будет работатьcmd2
  • cmd1 ; cmd2: Это запустится cmd1, а затем запустится cmd2независимо от сбоя или успешности выполнения cmd1.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.