我目前正在清理一些 shell 脚本。在这样做的时候,我遇到了一些看起来像这样的东西:
if [ ${#VARA} -eq 0 ] || [ ${#$VARB} -eq 0 ] || [ ${$VARC} -eq 0 ]; then
...
fi
如您所见,这里使用变量进行了三种不同类型的操作:${#V}
、${#$V}
和${$V}
。我很想解释一下这些。(加上Shellcheck 抱怨最后一个。)
我目前正在清理一些 shell 脚本。在这样做的时候,我遇到了一些看起来像这样的东西:
if [ ${#VARA} -eq 0 ] || [ ${#$VARB} -eq 0 ] || [ ${$VARC} -eq 0 ]; then
...
fi
如您所见,这里使用变量进行了三种不同类型的操作:${#V}
、${#$V}
和${$V}
。我很想解释一下这些。(加上Shellcheck 抱怨最后一个。)
此语法是 POSIX(因此是 Bash)shell 参数扩展的一部分。它计算变量的字符数:
$ myvar="foo" && echo ${#myvar}
3
最后两个没有有效的语法${#$VARB}
。${$VARC}
您不能以这种方式声明变量。
与你的很相似的${$VARC}
是 valid \$$myvar
,用于间接引用eval
or echo
。此语法指的是文字字符串“ $foo
”(when myvar="foo"
)。正如@chepner 提到的,由于 eval,不建议使用它。Bash 2.0 引入了${!myvar}
间接变量引用的语法,这是一个更可取的替代方案。
注意:你应该避免变量名大写,以免与shell变量混淆,shell变量也按惯例大写。