Bash脚本嵌套case调用函数无法通过命令行参数正常运行问题
Bash脚本命令行参数传递问题解决
你的脚本存在两个核心问题:
- 调用
test函数时没有传递任何参数,导致函数内的$2始终为空,无法触发对应分支 - 死循环会持续重复处理启动脚本时传入的同一批参数,没有实际意义
原脚本代码
#!/bin/bash trap 'echo "# $BASH_COMMAND";read' DEBUG test () { case "$2" in 3) echo "3" ;; 4) echo "4" ;; esac } while : do case "$1" in 1) echo "1" ;; 2) test;; esac done
修正后的脚本(命令行参数版本)
#!/bin/bash trap 'echo "# $BASH_COMMAND";read' DEBUG test () { case "$2" in 3) echo "3" ;; 4) echo "4" ;; *) echo "未匹配到3或4的参数" ;; esac } # 去掉死循环,命令行参数是启动时一次性传入的 case "$1" in 1) echo "1" ;; 2) test "$@";; # 传递脚本所有命令行参数给test函数 *) echo "未匹配到1或2的参数";; esac
使用说明
- 执行脚本时传入对应参数,比如:
- 执行
./script.sh 1,输出1 - 执行
./script.sh 2 3,输出3 - 执行
./script.sh 2 4,输出4
- 执行
核心修改点
- 调用
test函数时使用test "$@",将脚本收到的所有命令行参数完整传递给函数,这样函数内的$2就是脚本的第二个命令行参数 - 移除无意义的死循环,因为命令行参数是启动脚本时一次性传入的,重复处理同一参数没有价值
- 添加默认分支,处理未匹配的参数情况,避免脚本无输出
内容的提问来源于stack exchange,提问作者Федор Ермолаев
相关产品推荐
相关产品推荐

