目录
1、退出码含义
在shell脚本中,当一个命令或者脚本执行完毕时,会返回一个退出码(exit code)。这个退出码是一个整数,通常是一个整数,通常用来表示命令或脚本执行的结构状态。
约定俗成的含义:
0:表示命令或者脚本成功执行
非零: 表示命令或者脚本执行失败或者出现异常,不同的非零值可以表示不同的错误类型
2、获取退出码
可以使用特殊变量$? 来获取上一个命令的退出码。
例如:
ls /some/path
echo $?
在这个例子中,ls /some/path 执行后,echo $? 会输出 ls 命令的退出码。如果 /some/path 存在且有权限访问,那么 ls 命令将成功,$? 会是 0;否则,$? 会是一个非零值。
3、自定义退出码
在shell脚本中,可以使用exit命令自定义脚本的退出码。
例如:
#!/bin/bash
if [ -f "file.txt" ]; then
echo "File exists."
exit 0
else
echo "File does not exist."
exit 1
fi
在这个脚本中,如果 file.txt 存在,脚本会输出 File exists. 并以退出码 0 结束;如果不存在,会输出 File does not exist. 并以退出码 1 结束。
4、使用退出码进行流程控制
可以根据命令的退出码进行流程控制,比如使用if语句。
#!/bin/bash
command_to_run
if [ $? -eq 0 ]; then
echo "Command succeeded."
else
echo "Command failed with exit code $?."
fi
这里使用 if [ $? -eq 0 ] 来检查 command_to_run 的退出码是否为 0,如果是,则输出 Command succeeded.,否则输出 Command failed with exit code $?.
5、退出码的范围及常见的退出码
虽然退出码可以是 0 到 255 之间的任何值,但有些退出码有约定俗成的含义:
1:通用错误
2: 误用shell内置命令
126:权限问题,比如尝试执行一个没有执行权限的文件
127:命令未找到
6、多个命令的退出码处理
逻辑与操作(&&):
command1 && command2
command1 && command2 会先执行command1,如果command1的退出码为0,再执行command2。如果command1失败(非零退出码),command2将不会执行。
逻辑或操作(||):
command1 || command2
command1 || command2 会先执行command1,如果command1失败,则执行command2.如果command1成功,command2将不会执行。
7、函数的退出码
函数也可以使用retrun返回退出码,在函数内部使用return类似于脚本中使用exit:
#!/bin/bash
function my_function() {
if [ -f "file.txt" ]; then
return 0
else
return 1
fi
}
my_function
if [ $? -eq 0 ]; then
echo "Function succeeded."
else
echo "Function failed."
fi
8、使用退出码来处理防复杂的脚本逻辑
#!/bin/bash
# 尝试执行一个命令
ls /some/path
if [ $? -eq 0 ]; then
echo "ls command succeeded."
else
echo "ls command failed with exit code $?."
# 进行不同的错误处理
if [ $? -eq 2 ]; then
echo "Possible misuse of ls command."
elif [ $? -eq 126 ]; then
echo "Permission issue."
elif [ $? -eq 127 ]; then
echo "ls command not found."
else
echo "Unknown error."
fi
exit $?
fi
# 继续执行其他命令
cat file.txt
if [ $? -eq 0 ]; then
echo "cat command succeeded."
else
echo "cat command failed with exit code $?."
exit $?
9、总结
退出码在shell脚本中是一个重要的概念。通过使用和检查退出码,可以让脚本的执行更加可考,可维护,并且方便与其他脚本和程序进行交互和集成。