Shell程式設計-檔案讀取方法集錦

markzy5201190發表於2013-01-23
在這裡總結一下Shell讀取檔案的方法

[plain] view plaincopy
<embed>
  1. a),  
  2. #使用read命令讀取一行資料  
  3. while read myline  
  4. do  
  5.     echo "LINE:"$myline  
  6. done 
  7.   
  8. b),  
  9. #使用read命令讀取一行資料  
  10. cat datafile.txt | while read myline  
  11. do   
  12.     echo "LINE:"$myline  
  13. Done  
  14.   
  15. c),  
  16. #讀取一行資料  
  17. cat datafile.txt | while myline=$(line)  
  18. do   
  19.     echo "LINE:"$myline  
  20. Done  
  21.   
  22. d),  
  23. #讀取一行資料  
  24. while myline=$(line)  
  25. do   
  26.     echo "LINE:"$myline  
  27. done 
  28.   
  29. e),  
  30. #使用read命令讀取變數資料  
  31. cat datafile.txt | while read paraa parab parac  
  32. do  
  33.     echo "PARAA:"$paraa  
  34.     echo "PARAB:"$parab  
  35.     echo "PARAC:"$parac  
  36. Done  
  37.   
  38. f),  
  39. #使用read命令讀取變數資料  
  40. while read paraa parab parac  
  41. do  
  42.     echo "PARAA:"$paraa  
  43.     echo "PARAB:"$parab  
  44.     echo "PARAC:"$parac  
  45. done 


 

G),

下面這個是在學習公司的程式碼時碰到的,其實不能算是讀取檔案,應該算是從標準輸入讀取,程式碼如下:

[plain] view plaincopy
<embed>
  1. #!/bin/sh   
  2.   
  3. ip=192.168.253.111  
  4. while read line 
  5.         echo "  attempt with ($line)"  
  6.         # Try to connect and exit when done if it worked.  
  7.         $line && exit 0  
  8. done 3<
  9. /usr/bin/rlogin -l snap-admin $ip  
  10. /usr/bin/ssh dev@$ip  
  11. /usr/bin/ssh snap-admin@$ip  
  12. /usr/bin/ssh root@$ip  
  13. EOF  


 

網上有解釋說下面這個格式:

<

(內容)

EOF

    把EOF替換成其他東西

意思是把內容當作標準輸入傳給程式

在這個例子中這麼寫 3<應該是把它重定向到一個檔案描述符中,大家都知道檔案描述符都是一個整形,這裡的3就是作為一個檔案描述符來用。

這裡再簡要回顧一下的用法。當s h e l l看到的時候,它就會知道下一個詞是一個分界符。在該分界符以後的內容都被當作輸入,直到s h e l l又看到該分界符(位於單獨的一行)。這個分界符可以是你所定義的任何字串。

下面是對常見的檔案描述符命令的整理:

[plain] view plaincopy
<embed>
  1. command > filename  把標準輸出重定向到一個新檔案中  
  2.  command >> filename  把標準輸出重定向到一個檔案中(追加)  
  3.  command 1 > filename  把標準輸出重定向到一個檔案中  
  4.  command > filename 2 >&1 把標準輸出和標準錯誤一起重定向到一個檔案中  
  5.  command 2 >filename  把標準錯誤重定向到一個檔案中  
  6.  command 2 >> filename  把標準錯誤重定向到一個檔案中(追加)  
  7.  command >> filename 2 >&1 把標準輸出和標準錯誤一起重定向到一個檔案中(追加)  
  8.  command  filename2 command命令以filename檔案作為標準輸入,  
  9.       以filename2檔案作為標準輸出  
  10.  command 
  11.  command <
  12.  command 
  13.  command >&m   把標準輸出重定向到檔案描述符m中  
  14.  command 


 

2 ,就read命令的使用方法整理如下:

read命令從標準輸入讀取一行,並把輸入行的每個欄位(以指定的分隔符分隔)的值賦給命令列上的變數。 

[plain] view plaincopy
<embed>
  1. read [-ers] [-u fd] [-t timeout] [-p prompt] [-a array] [-n nchars] [-d delim] [name ...]  


 

引數解析: 

-e

 

-r

指定讀取命令把\(反斜槓)做為輸入行的一個普通字元,而非控制字元。

-s

安靜模式。如果指定該引數且從終端讀入資料,那麼輸入的時候將不回顯在螢幕上。

-u 

指定讀入資料的檔案描述符,不再使用預設的標準輸入。

-t 

等待標準輸入的超時時間,單位為秒。如果在指定的時間內沒有輸入,即時返回。

-p 

列印提示符,等待輸入,並將輸入賦值給REPLY變數或者指定的變數。

-a 

讀入一組詞,依次賦值給陣列array

-n 

讀取指定的字元數。如果已讀取n個字元,馬上返回,下次從返回點繼續讀取;如果已到行結束,無論滿不滿足n個字元都返回。

-d 

指定行結束符,讀到該字元就當做一行的結束。

name ...

指定read變數。read讀取一行資料後,分隔行資料為各個欄位,然後將欄位依次賦給指定的變數。如果分隔後的欄位數目比指定的變數多,那麼將把剩餘的全部欄位值都賦給最後的那個變數;反之,剩餘的變數被賦值為空字串。如果read沒有指定變數,系統使用預設的REPLY作為預設變數名。 

使用重定向讀取資料 

[plain] view plaincopy
<embed>
  1. exec 6
  2. while read -u 6 myline  
  3. do  
  4.     echo "LINE:"$myline  
  5. done  


 

變數分隔符 
read命令預設的分隔符是空格,多個空格被當做一個空格處理。我們也可以使用IFS(內部欄位分隔符)指定的的字元作為分隔符。假如有如下內容的一個檔案,它以$來分隔變數,希望把每個變數區別開來,可以使用如下指令碼: 

baidu$google$tencnt$sina

123456789

[plain] view plaincopy
<embed>
  1. #使用read命令讀取變數資料  
  2. while read paraa parab parac parad  
  3. do  
  4.     echo "PARAA:"$paraa  
  5.     echo "PARAB:"$parab  
  6.     echo "PARAC:"$parac  
  7.     echo "PARAD:"$parad  
  8. done 
  9. 執行指令碼的輸出如下:   
  10. PARAA:baidu  
  11. PARAB:google  
  12. PARAC:tencent  
  13. PARAD:sina  
  14. PARAA:123456789  
  15. PARAB:  
  16. PARAC:  
zz:http://lyklove123.blog.163.com/blog/static/199371378201282935514507/

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26855487/viewspace-753146/,如需轉載,請註明出處,否則將追究法律責任。

相關文章