bash +如何使用实例号定义数组变量

bash +如何使用实例号定义数组变量

是否可以将称为 machine1 的变量定义为 machine$counter ( while counter=1 )?

例如,我创建了该/tmp/config.txt文件并将 machine1 设置为数组:

 $ more /tmp/config.txt
 machine1=( linux_server critical 1.1.1.1 )
 machine2=( linux_server critical 1.1.1.2 )
 .
 .

然后我创建了以下简单的脚本来读取/tmp/config.txt.我尝试打印机器数组,如下所示:

 $ more read.config.bash
 #!/bin/bash

 source /tmp/config.txt
 counter=1
 echo ${machine$counter[0]}
 echo ${machine$counter[1]}
 echo ${machine$counter[2]}
 .
 .

但是当我运行脚本时,我得到:

$ ./read.config.bash
./read.config.bash: line 6: ${machine$counter[0]}: bad substitution
./read.config.bash: line 7: ${machine$counter[1]}: bad substitution
./read.config.bash: line 8: ${machine$counter[2]}: bad substitution

这个问题的解决办法是什么?

答案1

使用eval命令。

eval "echo \${machine${counter[0]}}"

请注意,第一个被转义,因此在处理字符串$之前不会对其进行求值。eval

其工作方式是eval执行命令,就像您在命令提示符下键入命令一样。不同之处在于所执行的命令可以通过编程方式构造。

因此,在您的场景中,当eval在命令上运行时,命令是实际上执行看起来像这样:echo ${machineBLAH}.内部变量替换已经由 shell 单独执行 eval运行。

有关更多信息,请参阅另一篇文章:bash 中的“eval”命令是什么?

答案2

您可以避免使用eval

source /tmp/config.txt
counter=1
line0="machine$counter[0]"
echo ${!line}

echo通过循环调用更好

for counter in 1 2 3
do
    line="machine$counter[@]"
    for element in "${!line}"
    do
        echo $element
    done
done

相关内容