我如何添加一个变量作为我想要检查值的变量的名称。我的代码如下,当我运行这个我得到错误:
[: A_variable: integer expression expected
Run Code Online (Sandbox Code Playgroud)
我认为这是因为在对变量执行 if 时,正确的语法应该是: if [ $A_variable -eq 1 ]; 但我无法将美元符号放在我的变量前面,因为我在变量的值中放置了一个不同的变量。
它几乎应该是:如果 [ $${letter}_variable 或一些混合,但我不知道是什么?
array=("A" "B" "C")
A_variable=1
B_variable=2
for letter in "${array[@]}"
do
if [ ${letter}_variable -eq 1 ]; then
...
Run Code Online (Sandbox Code Playgroud)
这在 bash 中称为间接扩展。
获取名称由另一个变量决定的变量值的语法namevar
是:
${!namevar}
Run Code Online (Sandbox Code Playgroud)
由于您的变量名称由一个变量和一个常量字符串组成,因此您需要一个中间步骤:
array=("A" "B" "C")
A_variable=1
B_variable=2
for letter in "${array[@]}"
do
varname="${letter}_variable"
if [ "${!varname}" -eq 1 ]; then
...
Run Code Online (Sandbox Code Playgroud)
注意:如果间接引用的变量实际上并不存在,那么展开会导致空字符串,这仍然会导致错误。如果这是不可取的,请先添加第二个这样的测试:
varname="${letter}_variable"
if [ "${!varname}" = "" ]; then
echo "Error: $varname is non-existent or empty"
elif [ "${!varname}" -eq 1 ]; then
...
Run Code Online (Sandbox Code Playgroud)
此外,如果所有可能的匹配变量的内容没有提前初始化为安全值,那么使用双引号来防止扩展结果中出现意外字符也是一个好主意。