Lew*_*ick 1 bash variable-expansion
我正在尝试理解bash 脚本,但在使用以下行时遇到了问题:
result=${!#}
Run Code Online (Sandbox Code Playgroud)
我!在这里找到了部分解决方案(内${}):
如果参数的第一个字符是感叹号 (!),则它引入了一个变量间接级别。Bash 使用由参数的其余部分形成的变量的值作为变量的名称;这个变量然后被扩展,并且该值用于替换的其余部分,而不是参数本身的值。这称为间接扩展。
解决方案的另一部分(#内${})在这里:
参数的扩展值的字符长度被替换。如果参数是“ ”或“@”,则替换的值是位置参数的数量。如果参数是一个以“ ”或“@”下标的数组名称,则替换的值是数组中的元素数。如果参数是一个下标为负数的索引数组名称,则该数字被解释为相对于大于参数的最大索引的一个,因此负索引从数组的末尾开始计数,并且索引 -1 引用最后一个元素。
但我不知道这两个是如何组合成result. 这条线有什么作用?
${#} 是当前 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一旦循环完成,就留下最后一个的值。