首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash从Bash变量中读取CSV值

问Bash从Bash变量中读取CSV值
EN

Stack Overflow用户
提问于 2017-10-21 00:06:23
回答 1查看 725关注 0票数 0

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

我希望脚本接受csv变量中的每个ip地址,并对其进行ping。如果变量中只有一个ip地址,下面的示例可以正常工作。

代码语言:javascript
复制
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。如果这有意义的话。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-21 02:12:39

"192.168.1.1,192.168.100.1"

这是你的问题。问题是,当while循环正在读取时,在第一次迭代之后就没有逗号了,所以它到达末尾并退出。"192.168.1.1,192.168.100.1,"应该表明你的意图。

正如其他人在评论中所建议的那样,我自己也会使用for循环,但是要想了解您是如何实现它的,这对您来说是可行的:

代码语言:javascript
复制
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变量的变化,而在循环结束后,在循环中分配的变量也将在父循环中可用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46858832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档