如何提取命令退出码?及如何将其用于脚本条件判断?
嘿,这两个问题在写shell脚本的时候真的是高频需求,我给你一步步讲明白~
1. 如何提取命令的退出码?
在shell环境里,每执行完一条命令,系统都会自动把它的退出码存在特殊变量$?里。命令执行成功时退出码是0,执行失败时是非0值(不同错误对应不同的非0数字)。
举个实际例子:
# 执行一个存在的目录的ls命令,肯定成功 ls /home # 打印上一条命令的退出码,会输出0 echo $? # 执行一个不存在的目录的ls命令,会报错 ls /this-dir-does-not-exist # 打印退出码,会输出非0值(比如2,具体数值取决于shell和命令) echo $?
⚠️ 注意:$?只会保存上一条命令的退出码,如果你执行了其他命令,它的值就会被覆盖。如果需要后续多次使用这个退出码,最好先把它存到一个普通变量里:
ls /nonexistent EXIT_CODE=$? # 之后可以随时用EXIT_CODE这个变量,不用担心被覆盖 echo "刚才的命令退出码是:$EXIT_CODE"
2. 如何提取命令的退出码并用于条件判断?
这里分两种常用场景,尤其是你说的「两个条件都满足才执行操作」的情况,我们来逐个看:
方式一:直接在条件中执行命令(更简洁)
shell的if语句本质上就是判断命令的退出码——如果命令退出码是0,就认为条件成立。结合&&逻辑运算符,可以轻松实现「多个条件都满足」的判断:
比如你的需求:第一个条件是某个变量等于特定值,第二个条件是某个命令执行成功(通过退出码判断),示例脚本如下:
# 假设第一个条件是当前用户是admin current_user=$(whoami) # 用&&连接两个条件:左边判断用户是否为admin,右边执行mkdir命令 if [ "$current_user" = "admin" ] && mkdir /tmp/admin-only-dir; then echo "两个条件都满足!现在执行指定操作~" # 这里写你要执行的操作,比如创建配置文件、启动服务等 touch /tmp/admin-only-dir/config.ini fi
解释一下:
- 只有左边的
[ "$current_user" = "admin" ]执行成功(退出码0),才会执行右边的mkdir命令 - 如果
mkdir也执行成功(退出码0),整个if的条件就成立,会执行大括号里的操作
方式二:先保存退出码再判断(更灵活)
如果你需要在判断前对退出码做一些处理,或者要复用这个退出码,就先把它存起来再判断:
current_user=$(whoami) # 先执行目标命令,保存退出码 mkdir /tmp/admin-only-dir mkdir_exit=$? # 同时判断两个条件:用户是admin,且mkdir的退出码为0 if [ "$current_user" = "admin" ] && [ "$mkdir_exit" -eq 0 ]; then echo "两个条件都满足!执行指定操作~" touch /tmp/admin-only-dir/config.ini fi
这里用[ "$mkdir_exit" -eq 0 ]来判断命令是否执行成功,-eq是shell里的「等于」比较运算符,用来判断数字是否相等。
内容的提问来源于stack exchange,提问作者intore
相关产品推荐
相关产品推荐

