【问题标题】:Iterating an ordered path variable in a for loop在 for 循环中迭代有序路径变量
【发布时间】:2015-10-30 17:31:20
【问题描述】:

我有以下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

但是这不起作用。推测是因为美元符号在一个表达式中被使用了两次。我也尝试过使用 {} 格式化变量,但仍然没有成功。

【问题讨论】:

标签: bash shell for-loop


【解决方案1】:

你可以使用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

【讨论】:

    【解决方案2】:

    我不知道 John1024 使用 !y 的解决方案。

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

    #!/bin/bash
    source /path/deviceIDs.txt
    u=($UDID{0..2});p=($PORT{0..2});b=($BOOTPORT{0..2})
    for i in {0..2}; do echo -e ${u[i]}"\n"${p[i]}"\n"${b[i]}"\n"; done 
    LGH811dec0bfd6
    4567
    5556
    
    41006289e4b2a179
    4568
    5557
    
    d9a7aa45
    4569
    5558
    

    【讨论】:

    • 作为 John1024 的回答和来自 Etan 节目的链接,实际上在 bash 中也有另一种方法
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多