如何添加变量作为我想要检查值的变量的名称。我的代码如下,当我运行它时,我收到错误:
[: A_variable: integer expression expected
我认为这是因为在变量上执行 if 时,正确的语法应该是: if [ $A_variable -eq 1 ];但我无法将美元符号放在变量前面,因为我在变量的值中放入了不同的变量。
它几乎就像应该是: if [ $${letter}_variable 或一些混合,但我不知道是什么?
array=("A" "B" "C")
A_variable=1
B_variable=2
for letter in "${array[@]}"
do
if [ ${letter}_variable -eq 1 ]; then
...
答案1
这就是所谓的间接扩张在bash中。
获取名称由另一个变量确定的变量的值的语法namevar
是:
${!namevar}
由于变量名由变量和常量字符串组成,因此您需要一个中间步骤:
array=("A" "B" "C")
A_variable=1
B_variable=2
for letter in "${array[@]}"
do
varname="${letter}_variable"
if [ "${!varname}" -eq 1 ]; then
...
笔记:如果间接引用的变量实际上不存在,则扩展将导致空字符串,这仍然会导致错误。如果这不合需要,请先添加第二个测试,如下所示:
varname="${letter}_variable"
if [ "${!varname}" = "" ]; then
echo "Error: $varname is non-existent or empty"
elif [ "${!varname}" -eq 1 ]; then
...
此外,如果所有可能的匹配变量的内容未提前初始化为安全值,那么使用双引号来防止扩展结果中出现意外字符将是一个好主意。
答案2
您正在将字符串(“A_variable”)与整数(“1”)进行比较。
您可以使用 来解决这个问题declare -n
。从help declare
:
-n 使 NAME 成为对其值命名的变量的引用
我们需要[[ .. ]]
避免未设置“C_variable”导致的错误。
#!/bin/bash
array=("A" "B" "C")
A_variable=1
B_variable=2
for letter in "${array[@]}"
do
declare -n foo="${letter}_variable"
if [[ "$foo" -eq 1 ]]; then
echo "Ding"
fi
done
奖励:您可以declare -i A_variable=1
将其设为整数。
-i 使 NAME 具有“integer”属性
答案3
该运算-eq
符用于数学表达式,但您正在比较字符串。
要比较字符串,请使用=
.