我正在尝试循环遍历环境变量。我有许多安装会发生变化,每个安装都有 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
答案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