理解间接

时间:2016-03-25 06:25:14

标签: shell variable-expansion indirection

我目前正在努力清理一些shell脚本。在这样做时,我遇到了这样的事情:

if [ ${#VARA} -eq 0 ] || [ ${#$VARB} -eq 0 ] || [ ${$VARC} -eq 0 ]; then
  ...
fi

正如您所看到的,这里有三种不同类型的变量:${#V}${#$V}${$V}。我很乐意为每一个解释。 (加上Shellcheck is complaining关于最后一个。)

1 个答案:

答案 0 :(得分:1)

此语法是POSIX(因此Bash)shell参数扩展的一部分。它计算变量的字符数:

$ myvar="foo" && echo ${#myvar}
3

最后两个${#$VARB}${$VARC}没有有效的语法。你不能用这种方式声明变量。

与您的${$VARC}非常相似的是有效\$$myvar,用于evalecho的{​​{3}}。此语法引用文字字符串" $foo" (当myvar="foo"时)。正如@chepner所提到的,indirect reference,不建议使用它。 Bash 2.0为间接变量引用引入了${!myvar}语法,这是一个更好的选择。

注意:你应该避免使用大写的变量名,不要混淆shell变量,这些变量也是按惯例大写的。