生活随笔
收集整理的這篇文章主要介紹了
while read line的问题
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
循環(huán)中的重定向 或許你應(yīng)該在其他腳本中見過下面的這種寫法: while read line do … done < file 剛開始看到這種結(jié)構(gòu)時(shí),很難理解< file是如何與循環(huán)配合在一起工作的。因?yàn)檠h(huán)內(nèi)有很多條命令,而我們之前接觸的重定向都是為一條命令工作的。這里有一個(gè)原則,這個(gè)原則掌握好了,這個(gè)問題就很簡單了:
對循環(huán)重定向的輸入可適用于循環(huán)中的所有需要從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)的命令; 對循環(huán)重定向的輸出可適用于循環(huán)中的所有需要向標(biāo)準(zhǔn)輸出寫入數(shù)據(jù)的命令; 當(dāng)在循環(huán)內(nèi)部顯式地使用輸入或輸出重定向,內(nèi)部重定向覆蓋外部重定向。 上面的while結(jié)構(gòu)中,read命令是需要從標(biāo)準(zhǔn)輸入中讀取數(shù)據(jù)的。我們來詳細(xì)了解一下read命令的用法吧,這個(gè)命令是shell腳本中使用頻率最高的命令之一。
read 先來看一下read的命令語法: read arg1 arg2 arg3 arg4 … read是一個(gè)用來賦值的命令,它需要從標(biāo)準(zhǔn)輸入獲得值,然后把這些值按位置依次賦值給變量arg1、arg2、arg3、arg4…,輸入的時(shí)候以空格作為字段分隔符。 read的一個(gè)最大特性是可以在腳本中產(chǎn)生交互,因?yàn)樗鼜臉?biāo)準(zhǔn)輸入讀取數(shù)據(jù)。read之所以很常用,一是因?yàn)槲覀兘?jīng)常需要賦值,二是因?yàn)樗梢越换?#xff0c;三是read能夠一次給多個(gè)變量賦值。
$ read host ip name linux 10.0.0.1 licong
$ echo $host $ip $name linux 10.0.0.1 licong
$ 可以看到,linux、10.0.0.1、licong分別被賦值給了變量host、ip和name。再看:
$ read host ip linux 10.0.0.1 licong
$ echo $host linux
$ echo $ip 10.0.0.1 licong
$ 當(dāng)我們輸入的字段比變量數(shù)目多時(shí),最后一個(gè)變量的值將不只一個(gè)字段,而是所有剩余的內(nèi)容;當(dāng)輸入字段比變量數(shù)少時(shí),多余的變量將是空值,你可以自己試試。現(xiàn)在我們再來看 while read line do … done < file read通過輸入重定向,把file的第一行所有的內(nèi)容賦值給變量line,循環(huán)體內(nèi)的命令一般包含對變量line的處理;然后循環(huán)處理file的第二行、第三行。。。一直到file的最后一行。還記得while根據(jù)其后的命令退出狀態(tài)來判斷是否執(zhí)行循環(huán)體嗎?是的,read命令也有退出狀態(tài),當(dāng)它從文件file中讀到內(nèi)容時(shí),退出狀態(tài)為0,循環(huán)繼續(xù)驚醒;當(dāng)read從文件中讀完最后一行后,下次便沒有內(nèi)容可讀了,此時(shí)read的退出狀態(tài)為非0,所以循環(huán)才會(huì)退出。 另一種也很常見的用法: command | while read line do … done 如果你還記得管道的用法,這個(gè)結(jié)構(gòu)應(yīng)該不難理解吧。command命令的輸出作為read循環(huán)的輸入,這種結(jié)構(gòu)長用于處理超過一行的輸出,當(dāng)然awk也很擅長做這種事。 APP_FILE=./aabb(這個(gè)是多行文件)
cat $APP_FILE|while read line
do
? ? ssh -q $line ls /home/admin
done
fail: 只執(zhí)行了一次,就退出了循環(huán) 這里的問題是所有的內(nèi)容都一起讀取出來寫到緩存里面了,讓SSH重定向出去了
注意: 1. ssh命令在每次執(zhí)行時(shí),會(huì)讀取所有的標(biāo)準(zhǔn)輸入中的內(nèi)容。
cat file |ssh 1.1.1.1 cat? 會(huì)讀取所有文件的內(nèi)容
2. 對于while循環(huán),當(dāng)按照如下方式使用時(shí):
? ? cat file | while read line
這里使用重定向,將文件內(nèi)容輸入到while命令,while命令每次使用read從輸入中讀取一行數(shù)據(jù)。
問題就在這里,如果在while循環(huán)中調(diào)用了ssh命令,那么ssh就會(huì)把當(dāng)前輸入中所有的數(shù)據(jù)讀走,也就是cat file重定向給while命令的數(shù)據(jù),都被ssh命令讀走了,以至于下次循環(huán)的時(shí)候,read讀到的內(nèi)容為空,導(dǎo)致循環(huán)提前結(jié)束。
解決這個(gè)問題兩種方式
1. ssh -n 使用-n參數(shù)
2. ssh xxxx < /dev/null重定向shell命令的輸入
主要參數(shù)說明:
-l 指定登入用戶
-p 設(shè)置端口號
-f 后臺(tái)運(yùn)行,并推薦加上 -n 參數(shù)
-n 將標(biāo)準(zhǔn)輸入重定向到 /dev/null,防止讀取標(biāo)準(zhǔn)輸入
-N 不執(zhí)行遠(yuǎn)程命令,只做端口轉(zhuǎn)發(fā)
-q 安靜模式,忽略一切對話和錯(cuò)誤提示
-T 禁用偽終端配置 參考文章 http://blog.163.com/clevertanglei900@126/blog/static/11135225920118742327322/
轉(zhuǎn)載于:https://www.cnblogs.com/centos-python/articles/8776217.html
總結(jié)
以上是生活随笔為你收集整理的while read line的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。