![bash +如何使用实例号定义数组变量](https://linux22.com/image/65254/bash%20%2B%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%AE%9E%E4%BE%8B%E5%8F%B7%E5%AE%9A%E4%B9%89%E6%95%B0%E7%BB%84%E5%8F%98%E9%87%8F.png)
是否可以将称为 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