我正在尝试了解bash script,但遇到以下问题:
result=${!#}
我找到了解决方案的一部分(!
中的${}
)here:
如果参数的第一个字符是感叹号(!),则会引入变量间接寻址级别。 Bash使用由其余参数形成的变量的值作为变量的名称;然后扩展此变量,并在其余替换中使用该值,而不是参数本身的值。这称为间接扩展。
解决方案的另一部分(#
中的${}
)是here:
参数的扩展值的字符长度被替换。如果参数为“ ”或“ @”,则替换的值为位置参数的数量。如果parameter是一个以“ ”或“ @”下标的数组名称,则替换的值为数组中元素的数量。如果parameter是带有负数后缀的索引数组名称,则该数字将被解释为相对于大于参数最大索引的整数,因此负索引从数组末尾算起,索引-1表示最后一个元素。
但是我不知道这两个如何组合成result
。这行是做什么的?
答案 0 :(得分:5)
${#}
是当前shell /函数中参数的数量:
$ set -- a b c
$ echo ${#}
3
!
执行间接参数扩展,因此将${#}
的值用作要扩展的参数的名称。
$ echo ${!#} # same as echo ${3}
c
简而言之,${!#}
扩展为最后一个参数的值。
在没有这样的bash
扩展名的情况下,人们可能会简单地编写一个循环,如
for result; do :; done # instead of result=${!#}
它将遍历位置参数,依次将result
设置为每个result
,并在循环完成后为"System.Globalization.Invariant": true
保留最后一个值。