我需要能够检查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
经过一些谷歌搜索后,我发现了this answer,但它无法正常工作。我认为这是因为这是检查变量CONFIG_STRING_TO_CHECK是否已设置...它始终是。
为了清楚起见,我希望检查是否设置了以下字符串:
custom1_config1
custom1_config2
不
CONFIG_STRING_TO_CHECK
我希望这是有道理的。皮斯帮助。
答案 0 :(得分:5)
使用间接扩展(for name, location in name_location_data:
sql = "UPDATE {tbl} SET location=? WHERE name=?".format(tbl=table_name)
cursor.execute(sql, name, location)
),如下所示:
!
请注意,您必须有一个中间变量名才能执行此操作 - 您无法执行~> A=a
~> B=b
~> a_b=c
~> A_B=${A}_${B}
~> echo ${!A_B}
c
。有关详细信息,请参阅echo ${!${A}_${B}}
:
如果参数的第一个字符是感叹号(!),那么 引入了一个变量间接层。 Bash使用的值 由参数的其余部分形成的变量作为名称 变量;然后展开此变量,并在该变量中使用该值 其余的替换,而不是参数本身的值。 这被称为间接扩张。对此的例外是 下面描述的$ {!prefix *}和$ {!name [@]}的扩展。该 感叹号必须紧跟左支撑以便 介绍间接。
编辑:我刚试过这个,似乎有效:
man bash
得到了:
# !/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
答案 1 :(得分:3)
declare
内置版可以使用-p
选项向您显示。
$ var=PATH
$ if declare -p "$var" &>/dev/null; then echo "$var is declared"; fi
PATH is declared
$ var=FOOBAR
$ if declare -p "$var" &>/dev/null; then echo "$var is declared"; else echo "$var is not declared"; fi
FOOBAR is not declared
此外,这可以封装到一个函数中:
$ is_declared() { declare -p "$1" &>/dev/null; }
$ if is_declared PATH; then echo OK; else echo NO; fi
OK
$ is_declared FOOBAR && echo OK || echo NO
NO
它适用于函数本地声明的变量
$ test_func() { local localvar=42; is_declared localvar && echo OK || echo NO; }
$ test_func
OK