linux shell腳本用while read逐行讀取文本的問題

轉自:https://zhidao.baidu.com/question/432126157616850964.html html

問題:緩存

我如今是想用一個腳本獲取必定列表服務器的運行時間。首先我創建一個名字爲ip.txt的IP列表(一個IP一行),再建好密鑰實現不用密碼直接登陸。而後寫腳本以下:
#!/bin/bash
while read ips;
do
echo $ips;
done < ip.txt
腳本實現了逐行讀取列表中的IP,可是:
#!/bin/bash
while read ips;
do
echo $ips;
upt=`ssh root@$ips "uptime"`;
echo $upt;
done < ip.txt
腳本實現了一個IP的檢測,就直接跳出來了。大神,求救!!!bash


大神解答:服務器

一、while使用機制,ip.txt文件中的信息都已經讀入並給了整個while語句。因此當咱們在while循環中再一次調用read語句,就會讀取到下一條記錄。問題就出在這裏,ssh語句正好回讀取輸入中的全部東西。爲了禁止ssh讀全部東西增長一個< //null,將ssh 的輸入輸入
while read ips;
do
        echo $ips;
        upt=`ssh root@${ip1} uptime < //null;`;
        echo $upt;
done < ip.txt;
二、用for
for ips in `cat ip.txt`; do
       echo ${ips};
       upt=`ssh root@${ips} uptime`;
       echo $upt;
done

高手啊,講解得很是透徹很是專業。我還想問你個問題:
一、爲何用</dev/null重定向就能夠禁止ssh讀取全部東西呢?/dev/null是否是把遠程的值重置爲空呢?這個問題有點抽象。
二、兄弟提到for語句,也寫得很精闢。for語句怎麼不存在while語句剛纔的那個問題?
三、剛纔樓上有個兄弟提到用-n參數,我試過也是能夠的,你能夠幫他回答一下爲何這個-n也能夠的嗎?

追答ssh

一、< /dev/null是告訴ssh若是要獲取就從/dev/null獲取,避免了獲取while緩存
二、for沒有一次把文件內容緩存獲取過來
三、看一下man ssh -n參數      Redirects stdin from /dev/null (actually, prevents reading from stdin).和</dev/null道理同樣。
相關文章
相關標籤/搜索