【问题标题】:Nested for-loop and arrays in BashBash 中的嵌套 for 循环和数组
【发布时间】:2021-04-30 21:41:34
【问题描述】:

我有一个输入文件,它是逗号分隔的行,我需要将其分配给如下所述的键,我已尝试分配它们,但我无法弄清楚如何分别分配它们,但如图所示组合在一起低于预期的结果。

如果有人能帮我解决这个问题,我将不胜感激,我之前没有使用过数组或逗号分隔的值,并且在让它工作时遇到问题。

输入文件

10.219.196.0,15gb,Azure Cloud
10.219.196.0,55gb,Google Cloud
10.219.196.0,54gb,AWS Cloud

我必须用密钥 IP 分配 IP 地址,用密钥大小分配大小,用密钥平台分配云名称,棘手的部分是我必须这样分配它

预期结果

IP1=10.219.196.0
Size1=15gb
Platform1=Azure Cloud
IP2=10.219.196.0
Size2=15gb
Platform2=Google Cloud
IP3=10.219.196.0
Size3=15gb
Platform3=AWS Cloud

我尝试过的解决方案如下

i=1;
for $line in `cat file`
 do 
    my_ary=$line
    echo "IP$i=${my_ary[0]}"\n
    echo "Size$i=${my_ary[1]}"\n
    echo "platform$i=${my_ary[2]}"\n
    $i++
 done

请告诉我如何解决此问题以获得预期结果。

【问题讨论】:

    标签: arrays bash for-loop


    【解决方案1】:

    for 中的变量必须不带美元符号。

    您可以使用read -a 将文件直接读入数组,而不是循环遍历cat。设置$IFS 以逗号分隔每一行。

    对于增量,使用算术表达式((...))

    echo 在打印其参数后添加一个换行符。不用写\n

    #! /bin/bash
    i=1
    while IFS=, read -a my_ary ; do 
        echo "IP$i=${my_ary[0]}"
        echo "Size$i=${my_ary[1]}"
        echo "Platform$i=${my_ary[2]}"
        ((i++))
    done < "$1"
    

    【讨论】:

    • 感谢您的快速响应。我实际上没有输入文件,我从 sed 输出中获取这些行,如何将输入行一次输入到上面的代码中?
    • 只需删除&lt; "$1"
    • 我想,如果我只使用输入文件,我做错了什么,我必须在上面的代码中传递路径吗?正如我看到这个 stack-answer.sh: 3: stack-answer.sh: cannot open : No such file
    • 如果我添加文件名代替 "$1" 我得到 stack-answer.sh: 3: read: Illegal option -a
    • 如何运行脚本?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 2014-03-11
    相关资源
    最近更新 更多