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

为何无法使用${$#}获取Shell脚本传入的最后一个参数?

为什么Bash里不能用${$#}获取最后一个位置参数,得用${!#}?

核心原因是Bash的参数展开语法有明确规则限制:

  • 首先,$#是特殊参数,它的值是当前脚本/函数的位置参数总数(比如传3个参数时,$#就是3)。但${$#}这种写法不符合Bash参数展开的语法逻辑——${}内部要求直接写变量名或特殊参数符号(比如$1、var),而非嵌套的变量引用。$#里的$会被当成语法的一部分,而非变量值的引用,且$#本身不是合法变量名(变量名不能包含$),所以这种写法会直接报错。

  • 而${!#}用的是Bash的间接参数展开语法:${!identifier}的作用是,先取identifier的值,把这个值当作新的变量名/参数名,再获取对应的值。放到这个场景里,就是先拿到$#的值(比如3),再去取${3}的值,也就是最后一个位置参数,刚好实现需求。

举个实际例子验证:
假设你运行脚本时传入参数apple banana cherry,执行以下命令:

echo "$#"          # 输出3
echo "${!#}"       # 输出cherry
echo "${$#}"       # 直接报错:bash: ${$#}: bad substitution

简单说,Bash没设计“在${}里直接嵌套解析变量值作为参数索引”的语法,必须通过间接展开的方式实现这种动态引用的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:15:00