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

时间:2020-01-23 15:29:30

标签: bash variable-expansion

我正在尝试了解bash script,但遇到以下问题:

result=${!#}

我找到了解决方案的一部分(!中的${}here

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

解决方案的另一部分(#中的${})是here

参数的扩展值的字符长度被替换。如果参数为“ ”或“ @”,则替换的值为位置参数的数量。如果parameter是一个以“ ”或“ @”下标的数组名称,则替换的值为数组中元素的数量。如果parameter是带有负数后缀的索引数组名称,则该数字将被解释为相对于大于参数最大索引的整数,因此负索引从数组末尾算起,索引-1表示最后一个元素。

但是我不知道这两个如何组合成result。这行是做什么的?

1 个答案:

答案 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保留最后一个值。

相关问题