我目前正在努力清理一些shell脚本。在这样做时,我遇到了这样的事情:
if [ ${#VARA} -eq 0 ] || [ ${#$VARB} -eq 0 ] || [ ${$VARC} -eq 0 ]; then
...
fi
正如您所看到的,这里有三种不同类型的变量:${#V}
,${#$V}
和${$V}
。我很乐意为每一个解释。 (加上Shellcheck is complaining关于最后一个。)
答案 0 :(得分:1)
此语法是POSIX(因此Bash)shell参数扩展的一部分。它计算变量的字符数:
$ myvar="foo" && echo ${#myvar}
3
最后两个${#$VARB}
和${$VARC}
没有有效的语法。你不能用这种方式声明变量。
与您的${$VARC}
非常相似的是有效\$$myvar
,用于eval
或echo
的{{3}}。此语法引用文字字符串" $foo
" (当myvar="foo"
时)。正如@chepner所提到的,indirect reference,不建议使用它。 Bash 2.0为间接变量引用引入了${!myvar}
语法,这是一个更好的选择。
注意:你应该避免使用大写的变量名,不要混淆shell变量,这些变量也是按惯例大写的。