如何在循环中引用构造的环境变量的值?

如何在循环中引用构造的环境变量的值?

我正在尝试循环遍历环境变量。我有许多安装会发生变化,每个安装都有 3 个 IP 来推送文件并运行脚本,我想尽可能地自动化这个过程(这样我只需要修改一个我将使用环境变量获取的文件)。以下是一个简化版本,一旦我弄清楚,我就可以解决我的问题。

因此在 my.props 中给出:

COUNT=2
A_0=foo
B_0=bar
A_1=fizz
B_1=buzz

我想在以下脚本中填写 for 循环

#!/bin/bash
. <path>/my.props

for ((i=0; i < COUNT; i++))
do
  <script here>
done

这样我就可以从环境变量中获取值。如下所示(但实际上有效):

echo $A_$i $B_$i

或者

A=A_$i
B=B_$i
echo $A $B

返回 foo bar 然后 fizz buzz

答案1

$ num=0
$ declare A_$num=42  # create A_0 and set it to 42
$ echo $A_0
42
$ b=A_$num           # create a variable with the contents "A_0"
$ echo ${!b}         # indirection
42

您可以迭代num并使用declare来创建变量并间接引用它们。但您真的不想使用数组吗?

for i in foo bar baz
do
    some_array+=($i)    # concatenate values onto the array
done

或者

string="foo bar baz"
some_array=($string)

这个怎么样?

$ cat IPs
192.168.0.1
192.168.0.2
192.168.0.3
$ cat readips
#!/bin/bash
while read -r ip
do
    IP[count++]=ip                 # is it necessary to save them in an array,
    do_something_directly_with ip  # if you use them right away?
done < IPs

答案2

A=`eval echo \$A_$i`

答案3

找到答案高级 Bash 脚本指南的间接引用章节

我需要做

eval A=\$A_$i
eval B=\$B_$i

答案4

不确定我是否完全理解你的问题,但如果你想要变量可用于子脚本,请使用export内置函数:

kbrandt@kbrandt:~/scrap$ help export
export: export [-nf] [name[=value] ...] or export -p
    NAMEs are marked for automatic export to the environment of
    subsequently executed commands.

从我认为你可能要做的事情来看,我只需将 IP 放在一个文件中,每行一个 IP。然后让安装脚本将 IP 读取为命令行参数:

while read ip; do
   ./install-script "$ip"
done < file_with_ips

如果每条记录有多条数据,那么您可以将其分离出来:

kbrandt@kbrandt:~/scrap$ cat file_with_data 
192.168.2.5:foobar:baz
kbrandt@kbrandt:~/scrap$ while IFS=":" read -r ip data1 data2; do 
> echo "$ip@$data1@$data2"
> done < file_with_data
192.168.2.5@foobar@baz

相关内容