【问题标题】:Loop over an shell argument which contains a list of values and write these values to a file遍历包含值列表的 shell 参数并将这些值写入文件
【发布时间】:2019-05-08 06:58:39
【问题描述】:

我在 Linux 中有一个 shell 脚本,它需要一个参数作为输入,其中可以包含一个 IP 地址列表。这些列表需要逐行写入文件。

./myTestScript.sh 192.168.100.2,192.168.100.3

在脚本中,要生成的输出是

192.168.100.2 OK
192.168.100.3 OK 

并写入名为 exceptions.map 的文件。

我对单个 IP 的想法可行,但是如何实现一个循环 ovre 来自参数的列表。

#!/bin/sh
IPADRESSES=$1
echo $IPADRESSES
sudo rm /appli/myApp/apps/mainApp/maintenance/exceptions.map
echo $IPADRESSES OK > "/appli/myApp/apps/mainApp/maintenance/exceptions.map"

【问题讨论】:

    标签: list shell loops command-line-arguments


    【解决方案1】:
    #!/bin/sh
    
    echo "$1" | tr , \\n | sed 's/$/ OK/' > exceptions.map
    

    或者,如果你真的想写一个循环:

    IFS=,
    for i in $1; do
            echo "$i OK"
    done
    

    请注意,此处的$1 必须不加引号,因为我们明确依赖于分词。但通常,我会稍微更改 API 并让调用者将每个 IP 作为单独的参数传递并执行for x; do echo "$x OK"; done

    【讨论】:

      【解决方案2】:

      一个命令,不需要循环:

      $ printf '%s OK\n' ${1//,/ } > "/appli/myApp/apps/mainApp/maintenance/exceptions.map"
      

      ${1//,/ } 通过将所有逗号替换为空格来拆分您的命令参数。 printf 根据您的格式打印每个 IP。

      ${1//,/ }也可以循环使用:

      for ip in ${1//,/ }; do something with "$ip"; done
      

      【讨论】:

        【解决方案3】:

        这是一种纯 bash 方式:

        #!/bin/bash
        
        IFS=, read -ra addresses <<<"$1"
        for addr in "${addresses[@]}"; do
            echo "$addr OK"
        done > exceptions.map
        

        IFS=... 行将第一个参数$1 的逗号分隔内容读入数组addresses。由于IFS=,,它们以逗号分隔。 for 循环然后依次打印每个地址,加上 OK。

        【讨论】:

        • 我不明白你为什么要在这里使用-r。如果用户在参数中明确使用转义的换行符,它们似乎应该被视为行继续而不是被删除。
        • @WilliamPursell 公平点:)。这是我的习惯做法,因为我过去不需要非-r 案例。
        • 非常感谢。它按预期工作,并且很好理解它是如何工作的。
        猜你喜欢
        • 1970-01-01
        • 2021-09-15
        • 2014-02-11
        • 2016-08-19
        • 1970-01-01
        • 2018-04-13
        • 1970-01-01
        • 2018-05-07
        • 1970-01-01
        相关资源
        最近更新 更多