Bash for循环不能正确理解变量?

时间:2013-04-11 23:53:35

标签: linux bash

如何增加已在bash中定义的变量?这就是我的意思:

ID1="YAY1"
ID2="YAY2"
for (( c=1; c<=3; c++ ))
  do
    if [ "$SOMEOTHERVAR" = "ID$c" ]; then BLAH; fi
  done

问题是,当它增加已定义的变量进行比较时,它认为ID $ c等于字符串ID1,而不是ID1等于YAY1,因此if语句总是计算为false。我希望这是有道理的。

感谢您的帮助!

** * *** 更新 * ** * **

感谢大家的帮助。最干净的解决方案是使用混合切割的单个阵列。可能不是最干净的方式,但效果很好。以下是一个片段:

# CONTACTS
declare -a EMAIL
EMAIL[1]="JS:jsmith@example.com"
EMAIL[2]="JD:jdoe@example.com"
EMAIL[3]="JK:jkennedy@example.com"

# FUNCTIONS
function EMAIL {
  for i in "${!EMAIL[@]}"; do
    POINTER="`echo ${EMAIL[$i]} | cut -d":" -f1`"; ADDRESS="`echo ${EMAIL[$i]} | cut -d":" -f2`";
    if [ "$POINTER" = "$PEMAIL" ]; then TO="$ADDRESS"; fi
    if [ "$POINTER" = "$SEMAIL" ]; then CC="$ADDRESS"; fi
  done
}

PEMAIL和SEMAIL是在脚本的另一部分从数据库中提取的比较器。

3 个答案:

答案 0 :(得分:2)

创建一个构建变量名的中间变量(我称之为newVar)。然后解除引用。以下代码将打印“匹配索引2”

ID1="YAY1"
ID2="YAY2"
for (( c=1; c<=3; c++ ))
  do
    newVar="ID${c}"
    if [ "YAY2" = "${!newVar}" ]; then echo "match for index $c"; fi
  done

答案 1 :(得分:1)

在你的例子中,使用数组是有意义的,因为变量的最后部分仍然是一个整数:

declare -a ids
ids[1]="YAY1"
ids[2]="YAY2"
for (( c=1; c < 3; c++ )); do
    if [ "$SOMEOTHERVAR" = "${ids[c]}" ]; then
        BLAH
    fi
done

如果它不总是一个整数,并且你有bash 4,你可以使用一个关联数组:

declare -A ids
ids['glow']="YAY1"
ids['stix']="YAY2"
for c in glow stix; do
    if [ "$SOMEOTHERVAR" = "${ids[c]}" ]; then
        BLAH
    fi
done

答案 2 :(得分:0)

没有C风格循环的解决方案:

ID1="YAY1"
ID2="YAY2"

for name in ${!ID*}; do
  if [ "$SOMEOTHERVAR" == "${!name}" ]; then echo "match for $name"; fi
done

$ {!ID *}扩展为前缀为“ID”的所有变量列表。