Как условно сделать что-то, если команда выполнена успешно или не выполнена

Как я могу сделать что-то подобное в bash?

 , если «команда» возвращает любую ошибку »;
тогда
    echo "Возврат ошибки"
еще
    эхо "Продолжить ..."
фи
 
185 голосов | спросил Shinmaru 17 +04002011-10-17T01:25:57+04:00312011bEurope/MoscowMon, 17 Oct 2011 01:25:57 +0400 2011, 01:25:57

10 ответов


231

Это именно то, что делает оператор bash if :

  if command; тогда
    echo «Команда преуспела»
еще
    echo "Command failed"
фи
 

Добавление информации из комментариев: вам do not необходимо использовать синтаксис [ ... ] . [ - это сама команда, почти эквивалентная тесту test ). Это, вероятно, самая распространенная команда для использования в if , что может привести к предположению, что это часть синтаксиса оболочки. Но если вы хотите проверить, выполнена ли команда или нет, используйте непосредственно эту команду с помощью if , как показано выше.

ответил Keith Thompson 17 +04002011-10-17T01:50:46+04:00312011bEurope/MoscowMon, 17 Oct 2011 01:50:46 +0400 2011, 01:50:46
83

Для небольших вещей, которые вы хотите выполнить, если команда оболочки работает, вы можете использовать конструкцию & amp; & amp; :

  rm -rf somedir & amp; & amp; & amp; trace_output "Удален каталог"
 

Аналогично, для небольших вещей, которые вы хотите выполнить при сбое команды оболочки, вы можете использовать || :

  rm -rf somedir || exit_on_error "Не удалось удалить каталог"
 

Или оба

  rm -rf somedir & amp; & amp; & amp; trace_output "Удален каталог" || exit_on_error "Не удалось удалить каталог"
 

С этими конструкциями, вероятно, не так-то просто делать, но иногда они могут сделать поток управления намного яснее.

ответил Bruce Ediger 17 +04002011-10-17T04:34:14+04:00312011bEurope/MoscowMon, 17 Oct 2011 04:34:14 +0400 2011, 04:34:14
71

Проверьте значение $? , которое содержит результат выполнения самой последней команды /функции:

  #! /Bin /Баш

эхо "это будет работать"
РЕЗУЛЬТАТ = $?
если [$ RESULT -eq 0]; тогда
  успех эха
еще
  echo failed
фи

если [$ RESULT == 0]; тогда
  успех эха 2
еще
  echo failed 2
фи
 
ответил 17 +04002011-10-17T01:34:27+04:00312011bEurope/MoscowMon, 17 Oct 2011 01:34:27 +0400 2011, 01:34:27
32

Это сработало для меня:

  command & amp; & amp; & amp; эхо "ОК" || эхо "NOK"
 

, если команда выполнена успешно, затем выполняется echo "OK" , и, поскольку она выполнена успешно, выполнение останавливается. В противном случае & amp; пропускается, и выполняется echo «NOK» .

ответил German Rumm 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 17 Sep 2013 10:36:37 +0400 2013, 10:36:37
4

Следует отметить, что if ... then ... fi и & amp; & amp; / || тип сделок с возвратом полученного результата командой, которую мы хотим проверить (0 на успех); однако некоторые команды не возвращают ненулевой статус выхода, если команда не выполнена или не может обрабатывать ввод. Это означает, что обычные подходы if и & amp; / || не будут работать для этих конкретных команд.

Например, в Linux GNU file по-прежнему выходит с 0, если он получил несуществующий файл в качестве аргумента, а find не смог найти указанный пользователем файла.

  $ find. -name "not_existing_file"
$ echo $?
0
$ file ./not_existing_file
./not_existing_file: невозможно открыть `./not_existing_file '(Нет такого файла или каталога)
$ echo $?
0
 

В таких случаях одним из возможных способов справиться с ситуацией является чтение сообщений stderr / stdin , например. те, которые возвращаются командой file , или анализировать вывод команды, как в find . Для этого можно использовать оператор case .

  $ file ./doesntexist | в то время как IFS = read -r output; делать
& GT; case "$ output" в
& GT; * «Нет такого файла или каталога» *) printf «% s \ n» «Это будет отображаться, если не удалось» ;;
& GT; *) printf "% s \ n" "Это будет отображаться, если выполнено" ;;
& GT; ESAC
& GT; сделанный
Это будет отображаться, если не удалось

$ find. -name "doesn'texist" | если ! читать IFS = out; затем echo «Файл не найден»; фи
Файл не найден
 
ответил Sergiy Kolodyazhnyy 12 72017vEurope/Moscow11bEurope/MoscowSun, 12 Nov 2017 21:57:33 +0300 2017, 21:57:33
1
  #! /Bin /Баш

если команда-1; тогда
   echo "command-1 удалось и теперь выполняется из этой команды-2"
   Команда-2
еще
   echo "command-1 не удалось и теперь выполняется из этой команды-3"
   Команда-3
фи
 
ответил Nick Vlădiceanu 22 32017vEurope/Moscow11bEurope/MoscowWed, 22 Nov 2017 19:04:28 +0300 2017, 19:04:28
0

Вы можете сделать это:

  if ($ (ping 4.4.4.4 -c1> /dev /null)); тогда
  эхо "ответ ping succsess !!!"
фи
 
ответил Daniel 1 PMpWed, 01 Apr 2015 18:19:16 +030019Wednesday 2015, 18:19:16
0

Как уже упоминалось в этом разделе, исходный вопрос в основном отвечает сам. Вот иллюстрация, показывающая, что условия if также могут быть вложенными.

В этом примере используется if , чтобы проверить, существует ли файл и является ли он обычным файлом. Если эти условия верны, проверьте, имеет ли он размер больше 0.

  #! /Bin /Баш

echo "Какой журнал ошибок вы проверяете сегодня?"
читать ответ

если [-f /opt/logs/$answer*.errors]
    тогда
        если [-s /opt/logs/$answer*.errors]
            тогда
                echo "Содержимое присутствует в файле журнала ошибок $ answer."
            еще
                echo «В файле журнала ошибок $ answer нет ошибок».
        фи
    еще
        echo "$ answer не имеет журнала ошибок в это время."
фи
 
ответил quartzinquartz 24 ThuEurope/Moscow2015-12-24T05:23:03+03:00Europe/Moscow12bEurope/MoscowThu, 24 Dec 2015 05:23:03 +0300 2015, 05:23:03
0

Самая большая ошибка, с которой я мог столкнуться, была:

  • Сначала получите значение. Предположим, вы сделали что-то вроде:

RR = $?

Теперь, для не только этой ситуации, но и других, с которыми вы можете столкнуться, рассмотрите:

определенная переменная:

$ AA = 1; if (("10 # 0 $ {AA}" == 1)); затем эхо да; else echo no; ц

Ответ: да

$ AA = 1; if (("10 # 0 $ {AA}"! = 1)); затем эхо да; else echo no; ц

Ответ: no

неопределенная переменная:

$ AA = 1; if (("10 # 0 $ {BB}" == 1)); затем эхо да; else echo no; ц

Ответ: no

$ AA = 1; if (("10 # 0 $ {BB}"! = 1)); затем эхо да; else echo no; ц

Ответ: да

$ AA = 1; if (("10 # 0 $ {BB}" == 0)); затем эхо да; else echo no; ц

Ответ: да

Это предотвращает ошибки всех видов.

Вероятно, вы знаете весь синтаксис, но здесь несколько советов:

  • Использовать кавычки. Избегайте "blank" ничего .
  • Новая современная нотация переменных - это $ {variable} .
  • Добавление нулевого числа, связанного до вашего номера, также избегает «никакого номера вообще».
  • Но подождите, добавив нуль, число станет base-8 . Вы получите сообщение об ошибке:
    • значение слишком велико для базы (токен ошибки - «08») для чисел выше 7 . То есть, когда вступает в игру 10 # :
    • 10 # заставляет номер base-10 .
ответил Dr Beco 19 72017vEurope/Moscow11bEurope/MoscowSun, 19 Nov 2017 04:15:29 +0300 2017, 04:15:29
-2

Это можно сделать просто так: $? дает вам статус последней выполненной команды.

Так может быть

  #! /Bin /ш

... некоторая команда ...

если [$? == 0]; тогда
  echo '<выходное сообщение, которое вы хотите отобразить>';
еще
  echo '<сообщение об ошибке>'
фи
 
ответил vipin mishra 18 +03002015-10-18T21:57:33+03:00312015bEurope/MoscowSun, 18 Oct 2015 21:57:33 +0300 2015, 21:57:33

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132