Как я могу сделать что-то подобное в Bash?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
bash
control-flow
Михаил Мрозек
источник
источник
then
на отдельной строке.if ! command ; then ... ; fi
.[
сама по себе команда, и в этом случае она не нужна.if [ ! command ]
не выполняетсяcommand
; он обрабатываетсяcommand
как строка и обрабатывается как истина, потому что он имеет ненулевую длину.[
это синонимtest
командыДля небольших вещей, которые вы хотите случиться, если работает команда оболочки, вы можете использовать
&&
конструкцию:Точно так же для небольших вещей, которые вы хотите, чтобы произошла ошибка команды оболочки, вы можете использовать
||
:Или оба
Вероятно, неразумно делать очень много с этими конструкциями, но иногда они могут сделать процесс контроля намного понятнее.
источник
Проверьте значение
$?
, которое содержит результат выполнения самой последней команды / функции:источник
if
идиому Баша . Я предпочитаю ответ Кита Томпсона.if
состоит в том, чтобы сделать это. Условия контроля потока в Баше все исследуют$?
за кулисами; это то, что они делают. Явное изучение его значения должно быть ненужным в подавляющем большинстве случаев и, как правило, является антипаттерном для начинающих.if ! cmd
это нормально. В противном случае, общая договоренность заключается в использованииelse
пункта. У вас не может быть пустого,then
но вы иногда видите,then : nothing; else
где:
неактивность важна.true
будет работать там же.Это сработало для меня:
если
command
успешно, тоecho "OK"
выполняется, и так как это успешно, выполнение останавливается там. В противном случае&&
пропускается иecho "NOK"
выполняется.источник
command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
command && echo "OK" || (c=$?; echo "NOK"; (exit $c))
?echo "OK"
часть может сама выйти из строя, то это лучше:command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
Следует отметить, что
if...then...fi
и&&
/||
тип подхода имеет дело с состоянием выхода, возвращаемым командой, которую мы хотим проверить (0 в случае успеха); однако некоторые команды не возвращают ненулевой статус выхода, если команда не выполнена или не может обработать ввод. Это означает, что обычныйif
и&&
/||
подходы не будут работать для этих конкретных команд.Например, в Linux GNU по-
file
прежнему завершает работу с 0, если он получил несуществующий файл в качестве аргумента иfind
не может найти указанный файл пользователем.В таких случаях одним из возможных способов справиться с ситуацией является чтение
stderr
/stdin
сообщения, например, те, которые были возвращеныfile
командой, или анализ выходных данных команды, как вfind
. Для этогоcase
можно использовать заявление.источник
Наиболее подверженной ошибкам я могла придумать:
RR=$?
Теперь, не только для этой ситуации, но и для других, с которыми вы можете столкнуться, подумайте:
определенная переменная:
$ AA=1 ; if (( "10#0${AA}" == 1 )) ; then echo yes ; else echo no ; fi
Ответ: да
$ AA=1 ; if (( "10#0${AA}" != 1 )) ; then echo yes ; else echo no ; fi
Ответ: нет
Неопределенная переменная:
$ AA=1 ; if (( "10#0${BB}" == 1 )) ; then echo yes ; else echo no ; fi
Ответ: нет
$ AA=1 ; if (( "10#0${BB}" != 1 )) ; then echo yes ; else echo no ; fi
Ответ: да
$ AA=1 ; if (( "10#0${BB}" == 0 )) ; then echo yes ; else echo no ; fi
Ответ: да
Это предотвращает все виды ошибок.
Вы, наверное, знаете весь синтаксис, но вот несколько советов:
"blank"
бытьnothing
.${variable}
.base-8
. Вы получите ошибку вроде:value too great for base (error token is "08")
для чисел выше7
. Вот когда10#
вступает в игру:10#
заставляет число бытьbase-10
.источник
Ты можешь сделать это:
источник
ping
которой записывается с учетом запуска его в виде команды. Но поскольку выходные данные перенаправляются в / dev / null, это всегда будет пустой строкой. Таким образом, вы ничего не запускаете в подоболочке, что означает, что предыдущее состояние выхода (подзаголовок подстановки команд, то есть ping) будет сохранено. Очевидно, правильный путьif ping ...; then
здесь.Как отмечено в другом месте в этой теме, исходный вопрос в основном отвечает сам. Вот иллюстрация, показывающая, что
if
условия также могут быть вложенными.В этом примере
if
проверяется, существует ли файл и является ли он обычным файлом. Если эти условия выполняются, проверьте, имеет ли он размер больше 0.источник
источник
Это может быть сделано просто так, так как
$?
дает вам статус последней выполненной команды.Так может быть
источник