首页 > 代码库 > shell中while循环引用ssh命令的坑
shell中while循环引用ssh命令的坑
原理shell代码如下:
#!/bin/sh cat ../androidsrc | while read line do ip=$(echo $line | awk ‘{print $1}‘) srcdir=$(echo $line | awk ‘{print $2}‘) destdir=$(echo $line | awk ‘{print $3}‘) user=$(echo $line | awk ‘{print $4}‘) port=$(echo $line | awk ‘{print $5}‘) build=$(echo $line | awk ‘{print $6}‘) echo $ip" "$srcdir" "$destdir" "$user" "$port" "$build #rsync -av $srcdir "-e ssh -p $port" $user@$ip:$destdir ssh -p $port $user@$ip sh $build done
androidsrc文件如下
xxx.yyy.zzz.zzz /data/build/xgame2/src/ /data/build/xgame/src/ sggame 61693 /data/build/buildgame.sh xxx.yyy.zzz.zzz /data/build/xgame2/src/ /data/build/xgame-ios/src/ sggame 61693 /data/build/buildgame2.sh xxx.yyy.zzz.zzz /data/build/xgame2/src/ /data/build/xgame/src/ sggame 61693 /data/build/buildgame.sh xxx.yyy.zzz.zzz /data/build/xgame2/src/ /data/build/xgame2/src/ sggame 61693 /data/build/buildgame2.sh xxx.yyy.zzz.zzz /data/build/xgame2/src/ /data/build/xgame/src/ sggame 61693 /data/build/buildgame.sh xxx.yyy.zzz.zzz /data/build/xgame2/src/ /data/build/xgame/src/ sggame 61693 /data/build/buildgame.sh xxx.yyy.zzz.zzz /data/build/xgame2/src/ /data/build/xgame/src/ sggame 61693 /data/build/buildgame.sh xxx.yyy.zzz.zzz /data/build/xgame2/src/ /data/build/xgame/src/ sggame 61693 /data/build/buildgame.sh xxx.yyy.zzz.zzz /data/build/xgame2/src/ /data/build/xgame/src/ sggame 61693 /data/build/buildgame.sh xxx.yyy.zzz.zzz /data/build/xgame2/src/ /data/build/xgame/src/ root 22 /data/build/buildgame.sh
其中,xxx.yyy.zzz.zzz表示IP地址
问题来源:在执行这个脚本之后,发现只执行了第一次,循环就中断了。
问题解析:经过查询,发现经过管道或重定向的androidsrc文件内容,被ssh -p $port $user@$ip sh $build提前吃掉了。
最终修改之后如下:
#!/bin/sh cat ../androidsrc | while read line do ip=$(echo $line | awk ‘{print $1}‘) srcdir=$(echo $line | awk ‘{print $2}‘) destdir=$(echo $line | awk ‘{print $3}‘) user=$(echo $line | awk ‘{print $4}‘) port=$(echo $line | awk ‘{print $5}‘) build=$(echo $line | awk ‘{print $6}‘) echo $ip" "$srcdir" "$destdir" "$user" "$port" "$build #rsync -av $srcdir "-e ssh -p $port" $user@$ip:$destdir ssh -p $port $user@$ip sh $build < /dev/null done
结论:while read时,如果遇到处理标准输入的命令cat,mail,ssh,grep,sed,awk等等,都应该考虑到这个问题。否则写shell的时候就是个坑
本文出自 “技术成就未来” 博客,谢绝转载!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。