You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求/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"

测试场景:

  1. 无参数运行:./test.sh → 两种方法都返回./test.sh
  2. 带参数运行:./test.sh hello world → 两种方法都返回world

内容的提问来源于stack exchange,提问作者user16634242

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:09:11