今天木有冷笑話,只有一個噩耗。噩耗是:今天木有冷笑話?。?!
不要總想著冷笑話嘛,有點追求,聽毛主席的話:好好學習,天天向上!
第七章輸入輸出、文件與命令執行
學C的應該了解標準輸入輸出和錯誤輸出吧?感覺總打很多字進度太慢,所以一直在省略類似C的東西,也方便以后看這篇文章的人能夠快速學完shell腳本(或者是快速看完這本書)。
讀取行read命令是重要方式之一,它可以自標準輸入讀取行后,通過shell字段切割的功能(使用$IFS)進行切分,第一部分給第一個變量,第二部分給第二個,類推。如果切割單詞多余變量,則剩下所有的給最后一個變量。如果輸入行以反斜杠結尾,則read會丟棄反斜杠與換行符繼續讀取下行數據。它有一個選項 -r,它將忽視最后反斜杠當讀入數據。使用read可能的一個錯誤是通過循環讓read讀取一個文件如:
while IFS=: read user pass uid gid fullname homedir shell < /etx/passwd ... 這個循環將一直下去并且每次read只讀passwd的第一行。因為每次循環都重新打開了passwd文件讀取內容。解決辦法是: cat /etc/passwd | while IFS=: read ....... 這樣通過管道解決讀取文件問題。 這里有一個概念,文件描述符,一般這個文件描述符是由0-9這幾個數字來描述的,所以傳統上shell也就允許你最多打開十個文件。比如make 1> results 2> ERRS 。命令make的標準輸出(文件描述符1)傳給results,并將錯誤輸出(文件描述符2)傳給ERRS。設置完文件描述符后,如何引用呢?像這樣:make > results 2>&1 。
1> results這里的1其實沒必要,供輸出重定向的默認文件描述符是標準輸出,也就是文件描述符1,重定向 > results讓文件描述符1作為文件results,接下來重定向2>&1有兩部分,2>重定向文件描述2,也就是標準錯誤輸出。而&1就是剛才我們的疑問,用來引用我們定義的文件描述符。特別注意:2>&1這樣的四個字符一定要連著寫。
再介紹一個用來改變shell本身I/O設置的exec命令。如果只有I/O重定向而沒有任何參數時,exec會改變shell的文件描述符:
代碼如下:
exec 2> /tmp/$0.log #重定向shell本身的標準錯誤輸出
exec 3< /some/file #打開新文件描述符3
...
read name rank serno <&3 #從該文件讀取 exec 3>&- #關閉文件描述符3
上例展示了如何關閉文件描述符。
exec還有一個功能就是在當前shell下執行指定的程序。
書中對printf做了完整的介紹,這里就不再介紹了,就是C里邊的那些東西。
shell中有兩種與文件名相關的展開:第一個是波浪號展開(~ tilde expansion),另一個叫法較多如通配符展開式(wildcard expansion)、全局展開(globbing)或路徑展開(pathname expansion)。
新聞熱點
疑難解答