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" [email protected]$ip:$destdir
        ssh -p $port [email protected]$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 [email protected]$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" [email protected]$ip:$destdir
        ssh -p $port [email protected]$ip sh $build < /dev/null
done

结论:while read时,如果遇到处理标准输入的命令cat,mail,ssh,grep,sed,awk等等,都应该考虑到这个问题。否则写shell的时候就是个坑

shell中while循环引用ssh命令的坑

时间: 2024-12-29 06:18:08

shell中while循环引用ssh命令的坑的相关文章

Shell中的循环语句实例

1.for循环语句实例1.1 最基本的for循环 #!/bin/bash for x in one two three four do     echo number $x done 注:"for" 循环总是接收 "in" 语句之后的某种类型的字列表.在本例中,指定了四个英语单词,但是字列表也可以引用磁盘上的文件,甚至文件通配符.实例1.2 #!/bin/bash for x in /var/log/* do     #echo "$x is a file

shell中常用I/O重定向命令格式说明

命令1  >    文件1 将命令1的输出结果重定向到文件1 命令1  &>  文件1 将命令1的输出结果和标准错误输出一起重定向到文件1 命令1  >>  文件1 将命令1的输出结果追加到文件1中 命令1  2>  文件1 将命令1的标准错误输出的结果重定向到文件1中 命令1  <     文件1 将文件1作为命令1的标准输入 命令1 << 字符串1   允许连续输入数据,直到接收到字符串1(常用于邮件系统) shell中常用I/O重定向命令格式说

shell中for循环总结

关于shell中的for循环用法很多,一直想总结一下,今天网上看到上一篇关于for循环用法的总结,感觉很全面,所以就转过来研究研究,嘿嘿... 1. for((i=1;i<=10;i++));do echo $(expr $i \* 4);done2.在shell中常用的是 for i in $(seq 10)3.for i in `ls` 4.for i in ${arr[@]}5.for i in $* ; do6.for File in /proc/sys/net/ipv4/confacc

检测项目中的循环引用引起的内存问题

说到检测项目中的循环引用 可以有很多手段,其中牛叉的 instruments 当然是把利器. 当然开发过程中往往会大意引起的 循环引用 比如:忘写了 @weakify(self) && @strongify(self); 在大量使用RAC 和 block..... 当然引起这类原因还有很多... 如果分工明确的话可能会再项目结束后,专门测试这块...然而好像并不是每次迭代都会做这块的工作,除非被明确发现引起崩溃的情况. so  要是能把这个工作引入debug 期间,如果引起循环引用 可以抛

shell中for循环

关于shell中的for循环用法很多,一直想总结一下,今天网上看到上一篇关于for循环用法的总结,感觉很全面,所以就转过来研究研究,嘿嘿... 1. for((i=1;i<=10;i++));do echo $(expr $i \* 4);done2.在shell中常用的是 for i in $(seq 10)3.for i in `ls` 4.for i in ${arr[@]}5.for i in $* ; do6.for File in /proc/sys/net/ipv4/confacc

shell 中的函数优先于 命令

在编译Android的时候 把下面的函数,添加到 envsetup.sh, 再运行 build/envsetup.sh 让其生效 function make() { local make=$(which make) echo "you are running function make" ${make} [email protected] } 而后运行 make, 运行的并不是可执行文件 make, 而是 envsetup 中定义的 make函数 在运行完make之后,如何还想执行别的

shell 中的 envl 及 crontab 命令

envl eval会对后面的命令进行两遍扫描,如果第一遍扫描后,命令是个普通命令,则执行此命令:如果命令中含有变量的间接引用,则保证间接引用的语义.也就是说,eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令.因此,eval命令适用于那些一次扫描无法实现其功能的变量. eval 执行以下两个步骤 第一次,执行变量替换,类似与C语言的宏替代 第二次,执行替换后的命令串 栗子: 1.  有一个名为test的文件,其内容为“Please move on !”,定义一个内容是cat test

(八)shell中的循环结构

1.for循环(1)要求:能看懂.能改即可.不要求能够完全不参考写出来.因为毕竟嵌入式并不需要完全重新手写shell,系统管理员(服务器运维人员,应用层系统级管理开发的才需要完全掌握shell) 这里将1 2 3 4 5依次打印出来 打印出当前目录文件 2.while循环(1)和C语言的循环在逻辑上无差别(2)要注意很多格式要求,譬如:while后面的[]两边都有空格,[]后面有分号分号(如果do放在一行的话),i++的写法中有两层括号. 3.echo的创建和追加输入文件(1)在shell中可以

如何在 iOS 中解决循环引用的问题

稍有常识的人都知道在 iOS 开发时,我们经常会遇到循环引用的问题,比如两个强指针相互引用,但是这种简单的情况作为稍有经验的开发者都会轻松地查找出来. 但是遇到下面这样的情况,如果只看其实现代码,也很难仅仅凭借肉眼上的观察以及简单的推理就能分析出其中存在的循环引用问题,更何况真实情况往往比这复杂的多: testObject1.object = testObject2; testObject1.secondObject = testObject3; testObject2.object = tes