bash中花括号内的感叹号和哈希

Lew*_*ick 1 bash variable-expansion

我正在尝试理解bash 脚本,但在使用以下行时遇到了问题:

result=${!#}
Run Code Online (Sandbox Code Playgroud)

!这里找到了部分解决方案(内${}):

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

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

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

但我不知道这两个是如何组合成result. 这条线有什么作用?

che*_*ner 5

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

$ set -- a b c
$ echo ${#}
3
Run Code Online (Sandbox Code Playgroud)

!执行间接参数扩展,所以的值${#}被用作参数,以扩大的名称。

$ echo ${!#}  # same as echo ${3}
c
Run Code Online (Sandbox Code Playgroud)

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


在没有这样的bash扩展的情况下,人们可能会简单地编写一个循环,如

for result; do :; done  # instead of result=${!#}
Run Code Online (Sandbox Code Playgroud)

这将迭代位置参数,result依次设置每个参数,result一旦循环完成,就留下最后一个的值。