理解间接
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 变量混淆,后者按照惯例也是大写的。
我目前正在清理一些 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 变量混淆,后者按照惯例也是大写的。