Значение выхода 0, выход 1 и выход 2 в сценарии bash

17

Я занимаюсь практическими упражнениями.

  

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

Я сделал решение:

#test for number of argument

if [ "$#" -eq 0 ] ; 
then
   echo -e "No argument."
   echo -e "Write a number between 1 and 12."
   exit 1
elif [ "$#" -gt 1 ] ;
then
   echo -e "More than 1 argument."
   echo -e "Write a number between 1 and 12."
   exit 1
else

   numb=
   case "$numb" in
      1) echo "Month: January";;
      2) echo "Month: February";;
      3) echo "Month: March";;
      4) echo "Month: April";;
      5) echo "Month: May";;
      6) echo "Month: June";;
      7) echo "Month: July";;
      8) echo "Month: August";;
      9) echo "Month: September";;
     10) echo "Month: October";;
     11) echo "Month: November";;
     12) echo "Month: December";;
      *) echo -e "You wrote a wrong number. Try again with writing number between 1 and 12.";;

   esac
fi
exit 2
exit 0

Что означают exit 1, exit 0 и exit 2 и почему мы их используем?

    
задан andrej benedičič 13.03.2017 в 16:15
источник

3 ответа

22

Вот одна хорошая ссылка на коды выхода оболочки :

Exit code 0        Success
Exit code 1        General errors, Miscellaneous errors, such as "divide by zero" and other impermissible operations
Exit code 2        Misuse of shell builtins (according to Bash documentation)        Example: empty_function() {}

Предостережение: использование правильного кода выхода не является обязательным требованием и не применяется оболочкой. Разработчики могут игнорировать руководство, если они считают это мудрым.

    
ответ дан user535733 13.03.2017 в 16:20
источник
18

Использование exit , а число - удобный способ передачи результатов вашего сценария. Он имитирует то, как команды bash выводят код возврата. С командами bash код возврата 0 обычно означает, что все выполнено успешно без ошибок. exit также заставляет ваш скрипт прекратить выполнение в этой точке и вернуться в командную строку.

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

Вы можете получить код возврата последней команды bash, используя переменную оболочки $? , например:

$ echo "something"
something
$ echo $?
0
$ cp
cp: missing file operand
Try 'cp --help' for more information.
$ echo $?
1

Когда вы используете это в скрипте, вы можете запросить код возврата таким же образом, когда это будет выполнено. Итак, вы увидите, что:

exit 2
exit 0

Является своего рода бессмысленным, так как вы никогда не сможете достичь exit 0 .

    
ответ дан Arronical 13.03.2017 в 16:24
3

Само по себе, exit подразумевает выходное значение нуля или успешное завершение вашего скрипта. Вам не нужно добавлять нулевой аргумент в команду exit, чтобы указать успешное завершение. Ваш скрипт может (или, вероятно, будет) успешно выйти, хотя он проверяет ошибочное состояние. В этом случае вы специально хотите, чтобы он вышел с условием ошибки (или 1).

echo -e "Enter numbers 1-4" \c"
read NUM
case $NUM in 
    1) echo "one";;
    2) echo "two";;
    3) echo "three";;
    4) echo "four";;
    *) echo "invalid answer"
       exit 1;;
esac

Команда exit в последней строке не обязательно должна быть там. Его можно было бы вызвать с нулевым или вообще не вызываемым. Без указания 1 аргумента команде exit ответ во всех этих случаях на echo $? будет равен нулю.

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

ответ дан geekasaurus 13.03.2017 в 21:04