Bash 脚本中 exit 0、exit 1 和 exit 2 是什么意思?

Bash 脚本中 exit 0、exit 1 和 exit 2 是什么意思?

我正在做一些练习。

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

我提出了一个解决方案:

# 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 0和是什么exit 2意思?为什么我们使用它们?

答案1

这是一个很好的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 不会强制执行。如果开发人员认为明智,可以忽略该指导。

答案2

使用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就意味着退出值为零,或者脚本成功完成。您不必将零参数添加到 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 $?

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

答案4

这(仍然)是 LinuxFoundation 的 LFS101x《Linux 简介》(免费课程)中的 case 语句练习。上面的代码将 exit 2 放错了位置,使得 exit 语句毫无意义(如原始回复中指出的那样)。在提供的练习解决方案中,exit 2 包含在 case 语句的最后一个 case“*”中,因此如果输入无效,case 语句会以错误退出。然后,在 esac 之后是 exit 0,表示如果绕过无效 case(和 exit 2),则代码成功完成。

相关代码行的截图

相关内容