2013-10-21 126 views
-4

任何人都可以解釋使用read i的部分。 i從哪裏來。關於bash shell腳本的澄清

scp -i ~/.ssh/id_rsa.sample [email protected]:ready/$2/*.zip ./$2 > slate.out 2>&1 

ls -1 $2/* > curr.lst 2>/dev/null 

while 
read i 
do 
    if 
    test -e ../done/"$i" 
    then 
     diff "$i" ../done/"$i" >/dev/null 2>&1 
    if 
     test $? -eq 0 
    then 
     rm "$i" 
    fi 
    fi 
done < curr.lst 
+2

對此的簡短回答是**否**有大量文檔可用於Bash,scp,diff以及此腳本的所有其他部分。如果你有關於部分語法的*特定*問題,請修改你的問題來說明。 –

+0

我知道這是有點苛刻,但我很困難。而使用'read i'的部分我無法得到'i'從哪裏來。 –

+0

讀命令正在讀取您在末尾指定的文件描述符中的數據... – Teja

回答

4

這句法read通常用來處理從文件中多行提出。讓我們通過省略內部循環來簡化:

while 
read i 
do 
    # Process i 
done < curr.lst 

'while x do;完成'的語法是非常基本的,很容易理解,但I/O重定向的添加可能會造成混淆。當您添加< curr.lstdone,它的意思是「使用該文件的內容作爲stdin的條件所以,如果你現在省略了循環,你會得到:

read i < curr.lst 

這是現在很清楚,read越來越其輸入從curr.lst和變量i設置爲每行的內容。因此,該代碼塊的基本意思是「處理每行curr.lst作爲變量i與循環內的代碼。

3

「讀」,根據手冊頁(在shell類型man page),從文件描述符中讀取。

在你的代碼中,循環從「curr.lst」每一行,這是擺在可變$i

+0

因此,在最後一行'done

+1

試試看,你會看到 – Asenar

+0

@Dark Matter - 這裏有一篇關於讀入文件和從文件讀取的基本要點的文章,包括'read line