Bash从Bash中的Variable读取CSV值

时间:2017-10-21 00:06:24

标签: linux bash

因此,在脚本中,我有一个变量,每次运行脚本时都会更改。变量是IP_PING。它基本上是一个由逗号分隔的地址列表。

我希望脚本在csv变量中获取每个ip addess并ping它。如果我在变量中只有一个IP地址,则下面的示例工作正常。

IP_PING="192.168.1.1"
echo "$IP_PING" | while read -r -d, ip1 
 do
   ping -c 4 "$ip1" >/dev/null 
     if [ $?  -ne 0 ]; then
     echo "Ping fail"
     else
     echo "Ping success"
     fi
 done

但是,如果我将IP_Ping变量更改为=" 192.168.1.1,192.168.100.1"该脚本仅读取第一个值192.168.1.1。是"阅读"用于此的错误命令。它将每个值作为单独的列读取。我希望单个列中的所有值,然后对每个值执行while。如果这是有道理的。

1 个答案:

答案 0 :(得分:0)

"192.168.1.1,192.168.100.1"

这是你的问题。问题是当while循环正在读取时,在第一次迭代之后没有更多的逗号,所以它会结束并退出。 "192.168.1.1,192.168.100.1,"应该显示您的预期方式。

正如其他人在评论中所建议的那样,我会自己使用for循环,但是对于你试图实现它的方式来说,这对你有用:

IP_PING="192.168.1.1,192.168.1.2,192.168.1.3"
while read -r ip1 ; do
   ping -c 4 "$ip1" >/dev/null 
     if [ $?  -ne 0 ]; then
     echo "Ping fail"
     else
     echo "Ping success"
     fi
done < <(echo $IP_PING |tr ',' '\n')

< <(echo $IP_PING |tr ',' '\n')是流程替换。简而言之,它会将输出“管道”到while循环中。与普通管道的不同之处在于它创建了一个较少的过程;实际的管道本身会创建一个过程。

使用process substitution也会将while循环保留在当前环境中。 (vs while循环通常采用env的'快照'并在循环期间使用它,然后在循环结束时消失)意味着,使用进程替换,while循环中的进程将能够看到env变量的变化在循环时父节点的变量,在循环中分配的AND变量在它结束后仍然可以在父节点中使用。