寻求/bin/bash中${!#}在/bin/sh下的等效实现方法
在/bin/sh中替代bash的${!#}的方案
首先需要明确:bash里的${!#}实际是获取最后一个位置参数——当脚本没有传入任何位置参数时,$#的值为0,此时${!#}等价于${!0}也就是$0(脚本自身路径/名称);如果有传入参数,比如./script.sh a b c,$#为3,${!#}就会返回$3(即最后一个参数c)。
要在/bin/sh中实现完全一致的行为,有两种可靠方法:
方法1:用eval动态解析参数引用
last_arg=$(eval echo "\${$#}")
工作逻辑:$#是当前位置参数的总数,通过eval把字符串\${$#}解析成对应的参数变量——比如$#=2时,会被解析为${2};当$#=0时,自动解析为${0},完美匹配bash中${!#}的效果。
方法2:通过shift循环遍历参数
last_arg=$0 while [ $# -gt 0 ]; do last_arg=$1 shift done
工作逻辑:先把last_arg初始化为$0(脚本自身),然后通过shift逐个向前移动位置参数,每次把当前第一个参数赋值给last_arg,直到所有参数处理完毕。最终last_arg要么是最后一个传入的位置参数,要么在无参数时保留$0。
测试示例
创建脚本test.sh:
#!/bin/sh # 方法1实现 last_arg1=$(eval echo "\${$#}") echo "方法1结果:$last_arg1" # 方法2实现 last_arg2=$0 while [ $# -gt 0 ]; do last_arg2=$1 shift done echo "方法2结果:$last_arg2"
测试场景:
- 无参数运行:
./test.sh→ 两种方法都返回./test.sh - 带参数运行:
./test.sh hello world→ 两种方法都返回world
内容的提问来源于stack exchange,提问作者user16634242
相关产品推荐
相关产品推荐

