前言
原本計劃國慶節第一天假期休息一天,但是想想自己還有很多事情沒有完成,就立馬打開電腦,開始幹活了。打算這7天的假期好好整理下之前學的技術和鞏固練習,充實每一天,好了入正題,Linux shell腳本基礎前面我們在介紹Linux shell腳本的控制流程時,還有一部分內容沒講就是有關here document的內容這裏繼續,Here Document 是 Shell 中的一種特殊的重定向方式,用來將輸入重定向到一個交互式 Shell 腳本或程序。
原文鏈接請標明:
http://blog.csdn.net/u011974987/article/details/52703400
本文出自:【stromxu的博客】
學習資料來源於:http://www.runoob.com/linux/linux-shell-io-redirections.html
正文
1、Shell 輸入/輸出重定向
重定向命令列表如下:
命令 | 說明 |
---|---|
command > file | 將輸出重定向到 file。 |
command < file | 將輸入重定向到 file。 |
command >> file | 將輸出以追加的方式重定向到 file。 |
n > file | 將文件描述符爲 n 的文件重定向到 file。 |
n >> file | 將文件描述符爲 n 的文件以追加的方式重定向到 file。 |
n >& m | 將輸出文件 m 和 n 合併。 |
n <& m | 將輸入文件 m 和 n 合併。 |
<< tag | 將開始標記 tag 和結束標記 tag 之間的內容作爲輸入。 |
- 需要注意的是文件描述符 0 通常是標準輸入(STDIN),1 是標準輸出(STDOUT),2 是標準錯誤輸出(STDERR)。
1.1、輸出重定向
重定向一般通過在命令間插入特定的符號來實現,語法如下:
command1 > file1
上面這個命令執行command1然後將輸出的內容存入file1。
注意任何file1內的已經存在的內容將被新內容替代。如果要將新的內容添加到文件的末尾,則使用>>操作符。
例子:
我們先新建一個文件test2,然後執行 ls -al 重定向到test2文件中,在命令行的操作符代碼如下:
#新建test2文件
touch test2
#輸出重定向
ls -al > test2
然後我們使用cat命令查看文件內容:
root@iZ28t5k4ny4Z:/usr/xiho/shell# cat test3
total 132
drwxr-xr-x 2 root root 4096 Oct 1 13:19 .
drwxr-xr-x 4 root root 4096 Sep 27 16:29 ..
-rw-r--r-- 1 root root 12288 Sep 27 19:15 .01.sh.swo
-rw-r--r-- 1 root root 12288 Sep 27 16:35 .01.sh.swp
-rwxr--r-- 1 root root 347 Sep 28 21:07 02.sh
-rwxr--r-- 1 root root 100 Sep 28 21:28 03.sh
-rw-r--r-- 1 root root 12288 Sep 28 21:15 .03.sh.swp
-rwxr--r-- 1 root root 109 Sep 28 22:17 04.sh
-rw------- 1 root root 12288 Sep 30 18:03 .04.swp
-rw-r--r-- 1 root root 0 Sep 28 22:45 05.sh
-rw-r--r-- 1 root root 12288 Sep 28 22:47 .05.sh.swp
-rw-r--r-- 1 root root 0 Sep 30 20:57 06.sh
-rw-r--r-- 1 root root 12288 Sep 30 21:00 .06.sh.swp
-rwxrwxrwx 1 root root 223 Sep 30 17:50 b.sh
-rw-r--r-- 1 root root 12288 Sep 30 18:03 .b.sh.swo
-rw-r--r-- 1 root root 12288 Sep 28 16:50 .b.sh.swp
-rwxrwxrwx 1 root root 119 Oct 1 13:12 demo.sh
-rwxr--r-- 1 root root 68 Sep 30 14:09 test1.sh
-rw-r--r-- 1 root root 954 Oct 1 13:10 test2
-rw-r--r-- 1 root root 0 Oct 1 13:19 test3
就會把當前目錄下的所有文件給顯示出來了。
如果不希望文件內容被覆蓋,可以使用 >> 追加到文件末尾,這個請自行練習使用。
1.2、輸入重定向
和輸出重定向一樣,Unix 命令也可以從文件獲取輸入,語法爲:
command1 < file1
這樣,本來需要從鍵盤獲取輸入的命令會轉移到文件讀取內容。注意:輸出重定向是大於號(>),出入重定向是小於號(<)。
例子
接着上面的例子,我們統計test2文件的行數,(不熟悉命令的同學,請查看我的 shell命令(二)的文章),執行以下命令:
wc -l test2
21 test2
也可以將輸入重定向到test2文件中:
wc -l < test2
21
注意:上面兩個例子的結果不同;第一個例子,會輸出文件名;第二不會,因爲它僅僅知道從標準輸入讀取內容。
command1 < infile > outfile
同時替換輸入和輸出,執行command1,從文件infile讀取內容,然後將輸出寫入到outfile中。
1.3、重定向深入理解
一般情況下,每一個Linux 命令運行時都會打開三個文件:
- 標準輸入文件(stdin): stdin的文件描述符爲0,linux程序默認從stdin讀取數據。
- 標準輸出文件(stdout): stdout 的文件描述爲1,linux程序默認想stdout輸出數據。
- 標準錯誤文件(stderr): stderr 的文件描述符爲2,linux程序會想stderr流中寫入錯誤信息。
以後打開文件後。新增文件綁定描述符 可以依次增加。 一條shell命令執行,都會繼承父進程的文件描述符。因此,所有運行的shell命令,都會有默認3個文件描述符。
正常情況下,command > file 將stdout重定向file,command < file 將stdin 重定向到 file。
一個命令執行了:
先有一個輸入:輸入可以從鍵盤,也可以從文件得到
命令執行完成:成功了,會把成功結果輸出到屏幕:standard output默認是屏幕
命令執行有錯誤:會把錯誤也輸出到屏幕上面:standard error默認也是指的屏幕
如果希望stderr 重定向 到file 可以這樣寫:
command 2> file
如果希望stderr追加到file 文件末尾,可以這樣寫:
command 2>> file
- 實例(通俗易懂)
顯示當前目錄文件,寫一個實際存在和一個不存在的,方便理解。比如當前目錄存在test1.sh,不存在xiho。代碼如下:
root@iZ28t5k4ny4Z:/usr/xiho/shell# ls test1.sh xiho
ls: cannot access xiho: No such file or directory
test1.sh
看到上面代碼顯示在屏幕上面,找不到文件路勁報錯,正確輸出與錯誤輸出都顯示在屏幕了,但是現在需要把正確輸出寫入suc.txt, 1> 可以省略,不寫,默認所至標準輸出,把錯誤輸出到err.txt,不輸出到屏幕。
例子如下:
ls test1.sh xiho 1> suc.txt 2>err.txt
然後我們分別查看suc.txt和err .txt的信息。
將錯誤輸出信息關閉掉
root@iZ28t5k4ny4Z:/usr/xiho/shell# ls test1.sh xiho 2>&-
test1.sh
root@iZ28t5k4ny4Z:/usr/xiho/shell# ls test1.sh xiho 2>/dev/null
test1.sh
&[n] 代表是已經存在的文件描述符,&1 代表輸出 &2代表錯誤輸出 &-代表關閉與它綁定的描述符
/dev/null 這個設備,是linux 中黑洞設備,什麼信息只要輸出給這個設備,都會給吃掉,哈哈~
其他的追加操作符等,好玩的自己去試試。
注意:
1、shell遇到”>”操作符,會判斷右邊文件是否存在,如果存在就先刪除,並且創建新文件。不存在直接創建。 無論左邊命令執行是否成功。右邊文件都會變爲空。
2、“>>”操作符,判斷右邊文件,如果不存在,先創建。以添加方式打開文件,會分配一個文件描述符[不特別指定,默認爲1,2]然後,與左邊的標準輸出(1)或錯誤輸出(2) 綁定。
3、當命令:執行完,綁定文件的描述符也自動失效。0,1,2又會空閒。
4、一條命令啓動,命令的輸入,正確輸出,錯誤輸出,默認分別綁定0,1,2文件描述符。
5、一條命令在執行前,先會檢查輸出是否正確,如果輸出設備錯誤,將不會進行命令執行。
2、Here Document
Here Document是shell 中的一種特殊重定向方式,用來將輸入重定向到一個交互式的shell腳本或程序。
基本的格式如下:
command << EOF
document
EOF
它的作用是將兩個EOF之間的內容(docuemnt)作爲輸入傳遞給command。
注意:
- 結尾的EOF一定要頂個寫,前面不能有任何字符,後面也不能有任何字符,包括空格和tab縮進。
- 開始的EOF前後的空格不要被忽略掉。
- 實例
在命令行中通過wc -l 命令計算Here Document 的行數:
root@iZ28t5k4ny4Z:/usr/xiho/shell# wc -l << EOF
> 學習使用shell 編程
> www.xuhaoblog.com
> EOF
2
輸出的結果爲2行。
我們也可以將Here Document 用在腳本中,例如:
1 #!/bin/bash
2 cat << EOF
3 學習使用shell腳本編程
4 www.xuhaoblog.com
5 EOF
執行以上腳本輸出的結果:
root@iZ28t5k4ny4Z:/usr/xiho/shell# chmod u+x 05.sh
root@iZ28t5k4ny4Z:/usr/xiho/shell# ./05.sh
學習使用shell腳本編程
www.xuhaoblog.com
Here Document 的簡單使用就到這裏,還有更多的操作符需要我們去練習。Linux shell腳本基礎學習,我們差不多介紹完了,還有一個關於函數的,準備放到下一篇來講。歡迎關注~
更多相關係列文章傳送門:
【CSDN】Linux Shell腳本基礎學習系列
【Linux 系統編程】shell 腳本基礎學習(一)
【Linux 系統編程】shell 命令和流程控制(二)
【Linux 系統編程】shell 流程控制loop和引號(三)
【Linux 系統編程】shell 輸入/輸出重定向及HereDocument(四)
【Linux 系統編程】shell 腳本基礎學習之函數(五)
本文由博主辛苦整理下來的筆記;
希望大家能夠指點或提出寶貴意見,共同學習,謝謝!
轉載請註明出處:http://blog.csdn.net/u011974987/article/details/52703400
歡迎關注我的社交網站~
個人博客:xuhaoblog.com
新浪微博:http://weibo.com/xuxiho
GitHub:https://github.com/git-xuhao