因此,在脚本中,我有一个变量,每次运行脚本时都会改变它。变量是IP_PING。它基本上是由逗号分隔的if地址的列表。
我希望脚本接受csv变量中的每个ip地址,并对其进行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。如果这有意义的话。
发布于 2017-10-21 02:12:39
"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循环中。与普通管道不同的是,它少创建一个进程;实际管道创建进程本身。
在当前环境中,使用过程替代还将保留while循环。(vs while循环通常获取env的“快照”,并在循环期间使用它,然后在循环结束时消失),这意味着,使用进程替换,while循环中的进程将能够看到父循环中的env变量的变化,而在循环结束后,在循环中分配的变量也将在父循环中可用。
https://stackoverflow.com/questions/46858832
复制相似问题