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

buz*_*ops 2 macos bash shell bsd

我有一堆像这样的数组:

array1=("A" "B")
array2=("C" "D")
array3=("E" "F" "G")
Run Code Online (Sandbox Code Playgroud)

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

for i in `seq 1 2`
do 
    for elm in ${array${i}[@]}
    do
        echo "the element in array$i is $elm" 
    done
done
Run Code Online (Sandbox Code Playgroud)

但是,这给了我:

./new_test.sh: line 6: ${array${i}[@]}: bad substitution
Run Code Online (Sandbox Code Playgroud)

我有点知道我正在做的事情是错的,因为我不想让第一个$评估${i}它的内部.

我该如何防止这种情况?

Jah*_*hid 6

这应该工作:

var=array$i[@]
for elm in ${!var}
...
Run Code Online (Sandbox Code Playgroud)

例:

#!/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
Run Code Online (Sandbox Code Playgroud)

输出:

the element in array1 is A
the element in array1 is B
the element in array2 is C
the element in array2 is D
Run Code Online (Sandbox Code Playgroud)


间接扩展(来自bash手册):

如果参数的第一个字符是感叹号(!),它会引入一个变量间接的级别.Bash使用从参数的其余部分形成的变量的值作为变量的名称; 然后展开此变量,并将该值用于替换的其余部分,而不是参数本身的值.这被称为间接扩张.例外情况是下面描述的$ {!prefix*}和$ {!name [@]}的扩展.感叹号必须紧跟左支撑,以引入间接.

  • @sjsam:我没有在任何地方看到任何证据......将`$ {array $ {i} [@]}`扩展为`$ {array1 [@]}`正是OP想要的...... (2认同)
  • 你应该引用扩展:`"$ {!var}"` (2认同)