List 在包含值列表的shell参数上循环,并将这些值写入文件

List 在包含值列表的shell参数上循环,并将这些值写入文件,list,shell,loops,command-line-arguments,List,Shell,Loops,Command Line Arguments,我在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的想法是可行的,但是如何实现循环还是从参数中获取列表 #!/bin/sh IPADRESSES=$1 echo $IPADRES

我在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的想法是可行的,但是如何实现循环还是从参数中获取列表

#!/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"

或者,如果确实要编写循环:

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

注意这里的
$1
必须保持不带引号,因为我们明确地依赖于分词。但是通常,我会稍微修改一下API,让调用方将每个IP作为一个单独的段传递,并对x执行
;做回显“$x OK”;完成

这里有一种纯粹的bash方式:

#!/bin/bash

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

IFS=,读取-ra地址一个命令,无需循环:

$ 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

我不明白你为什么要在这里使用
-r
。如果用户在参数中显式使用转义换行符,则它们似乎应被视为行的延续,而不是删除。@williampersell Fair point:)。这是我的习惯做法,因为我过去不需要非-r
案例。非常感谢。它的工作原理与预期一致,并且很好地理解了它的工作原理。
for ip in ${1//,/ }; do something with "$ip"; done