理解间接

Understanding indirection

我目前正在清理一些 shell 脚本。这样做的时候,我遇到了一些看起来像这样的东西:

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

如您所见,这里有三种不同类型的变量:${#V}${#$V}${$V}。我很想对这些中的每一个进行解释。 (加上Shellcheck is complaining关于最后一个。)

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

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

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

和你的${$VARC}很相似的是有效的$$myvar,用于indirect reference with eval or echo. This syntax refers to the literal string "$foo" (when myvar="foo"). As @chepner mentionned, because of eval,不建议使用。 Bash 2.0 为间接变量引用引入了 ${!myvar} 语法,这是一种更可取的替代方法。

注意:变量名应避免大写,以免与 shell 变量混淆,后者按照惯例也是大写的。