迭代for循环中的有序路径变量

时间:2015-10-30 17:31:21

标签: bash shell for-loop

我有以下txt文档:

deviceIDs.txt

UDID0=LGH811dec0bfd6
UDID1=41006289e4b2a179
UDID2=d9a7aa45

PORT0=4567
PORT1=4568
PORT2=4569

BOOTPORT0=5556
BOOTPORT1=5557
BOOTPORT2=5558

我希望能够编写以下bash脚本:

#!/bin/bash
source /path/deviceIDs.txt
for ((i=0;i<=2;i++))
do
    echo $UDID$i
    echo $PORT$i
    echo $BOOTPORT$i
done
然而,这并不起作用。可以推测,因为美元符号在一个表达式中被使用了两次。我也尝试使用{}格式化变量,但仍未成功。

2 个答案:

答案 0 :(得分:3)

您可以使用bash的间接形式:

#!/bin/bash
source deviceIDs.txt
for ((i=0;i<=2;i++))
do
    for x in UDID PORT BOOTPORT
    do
        y=$x$i
        echo ${!y}
    done
done

这里的关键是${!y}返回由y命名的变量的值。

这会产生输出:

LGH811dec0bfd6
4567
5556
41006289e4b2a179
4568
5557
d9a7aa45
4569
5558

替代

如果允许我们更改数据文件格式,请考虑以这种方式将变量定义为数组:

$ cat IDarrays.txt 
UDID=(LGH811dec0bfd6 41006289e4b2a179 d9a7aa45)
PORT=(4567 4568 4569)
BOOTPORT=(5556 5557 5558)

有了这个,脚本可以写成:

#!/bin/bash
source IDarrays.txt
for ((i=0;i<=2;i++))
do
    echo ${UDID[$i]}
    echo ${PORT[$i]}
    echo ${BOOTPORT[$i]}
done

答案 1 :(得分:0)

我不知道John1024的解决方案!

如果您无法修改deviceIDs.txt,因为它是由您无法控制的人生成的,您也可以使用这样的数组:

var i