Shell脚本exit命令异常:触发用法提示后未终止求助
问题分析与修复
你的问题根源特别直观——你把退出命令exit当成变量赋值来写了!
看你脚本里的这段代码:
if [[ $# -ne 1 ]] then echo "usage: ./findcmd command" fi exit=1
这里的exit=1并不是让程序终止的命令,而是给一个名为exit的变量赋值为1。所以当参数数量不对时,脚本打印完用法提示后并不会停止,而是继续执行后面遍历PATH的逻辑,最终导致用法提示和“命令不存在”的提示都被打印出来。
同样,你脚本末尾的exit=0也是一样的错误,这只是变量赋值,不是退出命令。
修正后的完整脚本
cmd="$1" ## the command to find if [[ $# -ne 1 ]]; then echo "usage: ./findcmd command" exit 1 # 真正的退出命令,终止程序并返回异常状态码 fi path=$(echo $PATH | tr ":" " ") for dir in $path; do if [[ -x "$dir/$cmd" && -r "$dir/$cmd" ]]; then echo "$dir/$cmd" exit 0 # 找到命令后正常退出,返回状态码0 fi done echo "$cmd not on $PATH" exit 0 # 遍历完PATH未找到命令,正常退出
关键修改点说明
- 把
exit=1改成exit 1:exit是bash内置命令,后面跟的是退出状态码(非0表示异常退出,0表示正常),执行后会立即终止脚本,不会继续执行后续代码。 - 补全了
if语句的分号(if [[ ... ]]; then),这是bash语法的硬性要求,避免出现语法错误。 - 所有的
exit=0都替换成exit 0,确保脚本在完成对应逻辑后正确终止。
这样修改后,当你不带参数运行脚本时,只会打印用法提示然后退出;当参数正确时,才会继续执行查找命令的流程,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Alexc




