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)
我希望这是有道理的。请帮助。
使用间接扩展(!),如下所示:
~> 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)