如果变量等于 bash 脚本

a.s*_*ith 2 bash

我如何添加一个变量作为我想要检查值的变量的名称。我的代码如下,当我运行这个我得到错误:

[: 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)

tel*_*coM 5

这在 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)

此外,如果所有可能的匹配变量的内容没有提前初始化为安全值,那么使用双引号来防止扩展结果中出现意外字符也是一个好主意。