Bash检查字符串是否作为变量存在

Ste*_*erg 1 variables bash defined

我需要能够检查bash中是否设置了各种类似的变量。

我需要检查是否已设置在变量CONFIG_STRING_TO_CHECK中定义的字符串。

我想做这样的事情:

#!/bin/bash

CUSTOM_PREFIX='custom1'

# Common Variable Name Endings:
CONFIG_STRINGS=( "config1" "config2" )

# Loop over common variable endings
for CONFIG_STRING in "${CONFIG_STRINGS[@]}" do :

  # Set the variable name to check
  CONFIG_STRING_TO_CHECK="${CUSTOM_PREFIX}_$CONFIG_STRING"

  # Check if variable is defined
  if [ -z ${CONFIG_STRING_TO_CHECK+x} ]; then
    echo "$CONFIG_STRING_TO_CHECK is declared";
  else
    echo "$CONFIG_STRING_TO_CHECK is not declared"; 
    exit 1;
  fi

done
Run Code Online (Sandbox Code Playgroud)

经过一番谷歌搜索后,我找到了这个答案,但这是行不通的。我认为是因为这正在检查是否已设置变量CONFIG_STRING_TO_CHECK ...始终如此。

为了清楚起见,我想检查一下是否设置了以下字符串:

custom1_config1
custom1_config2
Run Code Online (Sandbox Code Playgroud)

不:

CONFIG_STRING_TO_CHECK
Run Code Online (Sandbox Code Playgroud)

我希望这是有道理的。请帮助。

Joh*_*ohn 5

使用间接扩展(!),如下所示:

~> A=a
~> B=b
~> a_b=c
~> A_B=${A}_${B}
~> echo ${!A_B}
c
Run Code Online (Sandbox Code Playgroud)

请注意,您必须具有中间变量名才能执行此操作-不能echo ${!${A}_${B}}。看到man bash更多细节:

如果参数的第一个字符是感叹号(!),则它将引入一定程度的变量间接寻址。Bash使用由其余参数形成的变量的值作为变量的名称;然后扩展此变量,并在其余替换中使用该值,而不是参数本身的值。这称为间接扩展。例外是$ {!prefix *}和$ {!name [@]}的扩展,如下所述。感叹号必须紧随左括号之后才能引入间接指示。


编辑:我只是尝试与此,它似乎工作:

# !/bin/bash

CUSTOM_PREFIX='custom1'

custom1_config1="hi"
#custom1_config2="there"

# Common Variable Name Endings:
CONFIG_STRINGS=( "config1" "config2" )

# Loop over common variable endings
for CONFIG_STRING in "${CONFIG_STRINGS[@]}"; do
        CONFIG_STRING_TO_CHECK="${CUSTOM_PREFIX}_${CONFIG_STRING}"
        if [ -z ${!CONFIG_STRING_TO_CHECK} ]; then
                echo ${CONFIG_STRING_TO_CHECK} is not defined
        else
                echo ${CONFIG_STRING_TO_CHECK} is ${!CONFIG_STRING_TO_CHECK}
        fi
done
Run Code Online (Sandbox Code Playgroud)

并得到:

~/tmp/tst3> ./tmp.sh  
custom1_config1 is hi
custom1_config2 is not defined
Run Code Online (Sandbox Code Playgroud)