设为首页 收藏本站
查看: 603|回复: 0

shell中使用while循环ssh时只循环第一行的问题解决

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-27 09:01:45 | 显示全部楼层 |阅读模式
最近在写一个shell脚本,本想使用for循环来读取文件里面的内容,可是发现文件里每一行都有空格的,明显用for循环行不通过,我的目的是想一行一行读取文件内容,于是果断使用while循环来实现,可问题来了,当ssh完第一行后就退出了,后面都没有执行成功,如何避免自动读取一行就跳出while循环,此文将详细解释其原因。

文件内容如下:
[iyunv@Linus_hai~]#cat 2.txt
scjz 2144 10.16.100.113  89
scjz 2144 10.16.100.114  90

部分代码如下:
#!/bin/bash
ServerDir=/data/scjz_server
IpList=$1
Port=22
Num=3300
echo -e "\e[32m`cat $IpList` \e[0m"
echo -e "\033[31m 是否操作以上服务器的游戏服务,请确认(yes or no): \033[0m"
read confirm
if [ "$confirm" == "yes" ];then
while read line
do
   Platform=`echo $line |awk '{print $2}'`
   Ip=`echo $line |awk '{print $3}'`
   Id=`echo $line |awk '{print $4}'`
   Server=`ssh -p $Port $Ip "cd $ServerDir;/bin/ls -d *_${Platform}_s${Id}"`
   index=`echo $Server |awk -F_ '{print $1}'`
   MysqlPort=$(expr $index + $Num)
   echo $Ip $Server
done < $1
fi

    经过一番试验以后发现,是while中使用重定向机制,2.txt文件中的信息都已经读入并重定向给了整个while语句,所以当我们在while循环中再一次调用read语句,就会读取到下一条记录。问题就出在这里,ssh语句正好回读取输入中的所有东西,这就导致调用完ssh语句后,输入缓存中已经都被读完了,当read语句再读的时候当然也就读不到纪录,循环也就退出了。

改进方法是,修改ssh那一行,在ssh后面加上重定向输入就行了:

正确代码如下:
#!/bin/bash
ServerDir=/data/scjz_server
IpList=$1
Port=22
Num=3300
echo -e "\e[32m`cat $IpList` \e[0m"
echo -e "\033[31m 是否操作以上服务器的游戏服务,请确认(yes or no): \033[0m"
read confirm
if [ "$confirm" == "yes" ];then
while read line
do
   Platform=`echo $line |awk '{print $2}'`
   Ip=`echo $line |awk '{print $3}'`
   Id=`echo $line |awk '{print $4}'`
   Server=`ssh -p $Port $Ip "cd $ServerDir;/bin/ls -d *_${Platform}_s${Id}" < /dev/null`
   index=`echo $Server |awk -F_ '{print $1}'`
   MysqlPort=$(expr $index + $Num)
   echo $Ip $Server
done < $1
fi

这样,在while语句中也能顺利的执行ssh语句了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-91004-1-1.html 上篇帖子: Powershell获取文件夹大小和排序【层级关系】【大小】【名称】 下篇帖子: SHELL中$@和$*的比较
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表