0

如何增加已在 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 是在脚本的另一部分从数据库中提取的比较器。

4

3 回答 3

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
于 2013-04-12T00:03:50.107 回答
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
于 2013-04-12T00:00:45.713 回答
0

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

ID1="YAY1"
ID2="YAY2"

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

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

于 2013-04-12T08:34:17.057 回答