Можно сделать это легко с sed
:
sed -n '/\[cics\]/,/\[/p' <<-END
one
two [cics]
three
four
[five]
six
[seven]
[cics] eight
[nine]
ten
END
two [cics]
three
four
[five]
[cics] eight
[nine]
Вариант 2 - это вариант, только если вас волнует только разница между успехом и неудачей. Если вам нужно различать разные ненулевые статусы выхода, то необходим вариант 1.
some-command arg1 arg2
exit_status=$?
if [[ $exit_status -eq 0 ]]; then
# ...
elif [[ $exit_status -eq 1 ]]; then
# ...
elif [[ $exit status -eq 42 ]]; then
# ...
else
# ...
fi
(Вам необходимо сохранить $?
как exit_status
, потому что $?
будет сброшен первым [[...]]
; в случае сбоя первый elif
не будет проверять то же значение для $?
снова.)
Ну, не совсем необходимо . Третий вариант - использовать оператор case
, который может устранить необходимость в сохранении $?
, если вам не нужно снова обращаться к его значению.
some-command arg1 arg2
case $? in
0) # ...
;;
1) # ...
;;
42) # ...
;;
*) # ...
;;
esac
Можно использовать следующую идиому Бэша, которая может показаться нечитаемой, но на практике достаточно распространена.
ping -c1 "$host" && command_success || command_failure
Это вопрос предпочтений, но вторая форма может быть более безопасной, если вы намереваетесь добавить set -e
: эта форма по-прежнему будет работать, как ожидалось, а с В первой форме сценарий завершится немедленно, если ping
завершится неудачно (возвращается с ненулевым статусом выхода).
Примечание: оператор -eq
, а не eq
.