Я должен встроить команду в условное выражение или протестировать его код возврата?

Можно сделать это легко с 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
31.08.2014, 03:22
3 ответа

Вариант 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
3
27.01.2020, 21:50

Можно использовать следующую идиому Бэша, которая может показаться нечитаемой, но на практике достаточно распространена.

ping -c1 "$host" && command_success || command_failure
1
27.01.2020, 21:50

Это вопрос предпочтений, но вторая форма может быть более безопасной, если вы намереваетесь добавить set -e : эта форма по-прежнему будет работать, как ожидалось, а с В первой форме сценарий завершится немедленно, если ping завершится неудачно (возвращается с ненулевым статусом выхода).

Примечание: оператор -eq , а не eq .

5
27.01.2020, 21:50

Теги

Похожие вопросы