首页 > 系统服务 > 详细

linux while 循环仅执行了一次就退出,神坑

时间:2020-01-16 14:15:24      阅读:137      评论:0      收藏:0      [点我收藏+]

+++++++++++++++++++++++++++++++++++++++++

标题:linux while 循环仅执行了一次就退出了,神坑

时间:2020年1月16日

+++++++++++++++++++++++++++++++++++++++++

这次我们来聊聊Linux shell中while 循环的神坑,一不小心就中招了。

我们都知道while循环非常适合进行逐行处理文件,可以通过输入重定向的方式每读取一行数据,处理一行数据。

但是,while循环在逐行处理文件时,存在一个神坑,一不小心就中招了。

 

神坑:当while循环中存在ssh远程执行命令时,脚本仅执行一次循环就退出了,根本达不到预期的效果。这是就需要for循环入场了。具体怎么用可以参考最后的一个小脚本。

      for循环存在的问题是默认按照"空格"或"制表符"分割,如果需要按行分割,需要重新定义IFS分割符(IFS_OLD=$IFS;IFS=$‘\n‘)

 

我们来测试一下:

第一步:配置文件

# vim ip.conf

192.168.100.100

192.168.100.200

第二步:配置互信

# ssh-copy-id root@192.168.100.100          回车输入密码

# ssh-copy-id root@192.168.100.200          回车输入密码

第三步:编写测试脚本

# vim while_test.sh

while read ipaddr
do
  commond="ip a |grep ‘inet ‘ |grep ‘eth0$‘ |awk ‘{print $2}‘"
  ssh ${ipaddr} "${commond}"
done <while.conf

第四步:执行while测试脚本

# sh while_test.sh

192.168.100.100/24      //命令配置文件填了两台服务器,怎么只打印了一个

第五步:还是改成for循环测试

# vim for_test.sh

for ipaddr in `cat ip.conf`
do
  commond="ip a |grep ‘inet ‘ |grep ‘eth0$‘ |awk ‘{print $2}‘"
  ssh ${ipaddr} "${commond}"
done

# sh for_test.sh

192.168.100.100/24

192.168.100.200/24

linux while 循环仅执行了一次就退出,神坑

原文:https://www.cnblogs.com/lv1572407/p/12200248.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!