+++++++++++++++++++++++++++++++++++++++++
标题: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
原文:https://www.cnblogs.com/lv1572407/p/12200248.html