在bash中,花括号内的感叹号和井号的含义是什么?

3

我正在尝试理解一个bash脚本,但是我对以下这行代码感到困惑:

result=${!#}

我在这里找到了解决方案的一部分(!${}中):这里

如果参数的第一个字符是感叹号(!),则引入变量间接级别。Bash使用从参数余下的部分形成的变量的值作为变量的名称;然后展开该变量,并在替换的其余部分中使用该值,而不是使用参数本身的值。这称为间接扩展。

另一个解决方案的一部分(#${}中)在这里

被替换的是参数扩展值的字符数。如果参数是“”或“@”,则替换的值是位置参数的数量。如果参数是由“”或“@”索引的数组名称,则替换的值是数组中元素的数量。如果参数是由负数索引的索引数组名称,则该数字被解释为相对于参数的最大索引加1,因此负索引从数组末尾开始计数,索引为-1表示最后一个元素。

但我不知道这两个如何组合成result。这行代码是干什么用的?
1个回答

7

${#} 是当前 shell/function 中参数的数量:

$ set -- a b c
$ echo ${#}
3
! 执行间接参数扩展,因此 ${#} 的值被用作要扩展的参数名称。
$ echo ${!#}  # same as echo ${3}
c

简而言之,${!#} 展开为最后一个参数的值。


在没有这样的 bash 扩展的情况下,可以简单地编写一个循环,如下所示:

for result; do :; done  # instead of result=${!#}

该函数将按顺序迭代位置参数,并将result依次设置为每个参数,一旦循环完成,result将具有最后一个参数的值。

对于那些被set -- a b c搞糊涂的人,你可以只使用set a b c(即不带“--”)来获得相同数量的参数。 - Kiteloopdesign

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接