如何评估变量bash脚本中的变量?

时间:2016-05-16 05:31:31

标签: bash macos shell bsd

我有一堆像这样的数组:

array1=("A" "B")
array2=("C" "D")
array3=("E" "F" "G")

我想循环遍历数组,以及每个数组中的元素。以下是我试图完成此任务的方法:

for i in `seq 1 2`
do 
    for elm in ${array${i}[@]}
    do
        echo "the element in array$i is $elm" 
    done
done

但是,这给了我:

./new_test.sh: line 6: ${array${i}[@]}: bad substitution

我知道我所做的事情是错误的,因为我不希望第一个$评估其内部的${i}

如何防止这种情况?

2 个答案:

答案 0 :(得分:6)

这应该有效:

var=array$i[@]
for elm in ${!var}
...

示例:

#!/bin/bash
array1=("A" "B")
array2=("C" "D")
array3=("E" "F" "G")

for i in `seq 1 2`
do 
    var=array$i[@]
    for elm in "${!var}"
    do
        echo "the element in array$i is $elm" 
    done
done

输出:

the element in array1 is A
the element in array1 is B
the element in array2 is C
the element in array2 is D

<小时/> Indirect expansion (from bash manual):

  

如果参数的第一个字符是感叹号(!),那么   引入了一个变量间接层。 Bash使用的值   由参数的其余部分形成的变量作为名称   变量;然后展开此变量,并在该变量中使用该值   其余的替换,而不是参数本身的值。   这称为 间接扩展 。对此的例外是   下面描述的$ {!prefix *}和$ {!name [@]}的扩展。该   感叹号必须紧跟左支撑以便   介绍间接。

答案 1 :(得分:0)

#!/bin/bash

array1=("A" "B")
array2=("C" "D")
array3=("E" "F" "G")

for i in "array"{1..3}"[@]"; do
    echo "$i"
    for el in "${!i}"; do
        echo "$el"
    done
done

输出是:

array1[@]
A
B
array2[@]
C
D
array3[@]
E
F
G