bash脚本中出口0,出口1和出口2的含义


49

我正在做一些练习。

编写一个脚本,该脚本将使用月份号作为参数,并将其转换为月份名称。结果将被打印到标准输出。

我提出了一个解决方案:

#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=$1
   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 0exit 2意味着,我们为什么要使用它?


5
成功执行的代码应以代码0退出。其他值表示错误。例如,请参见具有特殊含义的退出代码
V. Olsen

2
bash脚本就像电影院一样,存在着不同之处。exit语句标记了bash解释器的出口位置。当脚本被触发时,解释器需要运行直到最近的出口。
DepressedDaniel

5
如果这是您编写的代码,那么您为什么使用甚至不理解的语句?
德米特里·格里戈列耶夫

5
1)您同意的批复张贴的问题后。给它24小时以等待更好的答案。2)公认的答案是错误和误导的。正确的答案是“退出代码没有默认含义(超过0 =成功);您作为脚本开发者来定义语义”。3)如果创建了该脚本,为什么还要添加退出命令(从逻辑上讲,所有这些命令都是多余的,或者因为无论如何都使用if-else可能会折叠为“退出1”)。
AnoE

Answers:


58

这是shell退出代码的一个很好的参考

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() {}

注意:不需要使用正确的退出代码,并且Shell不会强制执行。如果开发人员认为明智的话,可以忽略它们。


8
不过要小心。退出代码的含义完全取决于程序的开发人员。
muru

同样,虽然链接的源代码《 Advanced Bash脚本指南》声称显示“ 保留的退出代码”(原始强调),但该声明既未被引用,也完全是错误的
伊利亚·卡根

23

使用exit和数字是显示脚本结果的一种便捷方法。它模仿了bash命令输出返回码的方式。使用bash命令时,返回码0通常表示一切都已成功执行且没有错误。exit还使您的脚本在那一刻停止执行并返回命令行。

任何大于0的返回码都表示某种错误,尽管有时该错误并不严重,对于每个命令,应该可以找到一些文档来告诉您每个返回码的含义。

您可以使用shell变量来获取最后一个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


3

所有这些本身就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最后一行中的命令完全没有必要。可以用零调用它,也可以根本不调用它。如果不为exit命令指定1参数,则在所有这些情况下的答案均为echo $?零。

但是,通过为exit命令指定1参数,对的响应echo $?将为1。因此,当您要指定脚本以错误条件退出时,请对exit命令使用1参数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.