防偽碼:桃花潭水深千尺,不及汪倫送我情。
文件描述符(fd):文件描述符是一個非負整數,在打開現存文件或新建文件時,內核會返回一個
文件描述符,讀寫文件也需要使用文件描述符來訪問文件。
內核為每個進程維護該進程打開的文件記錄表。文件描述符只適于 Unix、Linux 操作系統。
8. 1 ?標準輸入、輸出和錯誤
文件描述符 ?描述 ?映射關系
0 ?標準輸入,鍵盤 ?/dev/stdin -> /proc/self/fd/0
1 ?標準輸出,屏幕 ?/dev/stdout -> /proc/self/fd/1
2 ?標準錯誤,屏幕 ?/dev/stderr -> /proc/self/fd/2
8.2 ?重定向符號
符號 ?描述
> ?符號左邊輸出作為右邊輸入(標準輸出)
>> ?符號左邊輸出追加右邊輸入
< ?符號右邊輸出作為左邊輸入(標準輸入)
<< ?符號右邊輸出追加左邊輸入
& ?重定向綁定符號
輸入和輸出可以被重定向符號解釋到 shell。
shell 命令是從左到右依次執行命令。
下面 n 字母是文件描述符。
8.3 ?重定向 輸出
1)覆蓋輸出
一般格式:[n]>word
如果 n 沒有指定,默認是 1
示例:
打印結果寫到文件:echo "test" > a.txt
當沒有安裝 bc 計算器時,錯誤輸出結果寫到文件:echo "1 + 1" |bc 2> error.log
2)追加重定向輸出
一般格式:[n]>>word
如果 n 沒有指定,默認是 1
示例:
打印結果追加到文件:echo "test" >> a.txt
當沒有安裝 bc 計算器時,錯誤輸出結果追加文件:echo "1 + 1" |bc 2> error.log
8.4 4 重定向輸入
一般格式:[n]<word
如果 n 沒有指定,默認是 0
示例:
a.txt 內容作為 grep 輸入:grep "test" --color < a.txt
8.5 5 重定向標準輸出和標準錯誤
1)覆蓋重定向標準輸出和標準錯誤
兩種格式重定向標準輸出和標準錯誤:
&>word 和>&word 等價于>word 2>&1
&將標準輸出和標準輸入綁定到一起,重定向 word 文件。
示例:
當不確定執行對錯時都覆蓋到文件:echo "1 + 1" |bc &> error.log
當不確定執行對錯時都覆蓋到文件:echo "1 + 1" |bc > error.log 2>&1
2)追加標準輸出和標準錯誤
追加格式:&>>word 等價于>>word 2>&1
當不確定執行對錯時都追加文件:echo "1 + 1" |bc &>> error.log
將標準輸出和標準標準輸入追加重定向到 word:
<<[-]word
here-document
delimiter
從當前 shell 讀取輸入源,直到遇到一行只包含 delimiter 終止,內容作為標準輸入。
將 eof 標準輸入作為 cat 標準輸出再寫到 a.txt:
# cat <<eof
123
abc
eof
123
abc
# cat > a.txt << eof
> 123
> abc
> eof
8.6 ?重定向到 空設備
/dev/null 是一個空設備,向它寫入的數組都會丟棄,但返回狀態是成功的。與其對應的還有一個
/dev/zero 設備,提供無限的 0 數據流。
在寫 Shell 腳本時我們經常會用到/dev/null 設備,將 stdout、stderr 輸出給它,也就是我們不想
要這些輸出的數據。
通過重定向到/dev/null 忽略輸出,比如我們沒有安裝 bc 計算器,正常會拋出沒有發現命令:
# echo "1 + 1" |bc >/dev/null 2>&1
這就讓標準和錯誤輸出到了空設備。
忽略標準輸出:
# echo "test" >/dev/null
忽略錯誤輸出:
# echo "1 + 1" |bc 2>/dev/null
d 8.7 read ?命令
read 命令從標準輸入讀取,并把輸入的內容復制給變量。
命令格式: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p
prompt] [-t timeout] [-u fd] [name ...]
-e ?在一個交互 shell 中使用 readline 獲取行
-r ?不允許反斜杠轉義任何字符
-s ?隱藏輸入
-a array ?保存為數組,元素以空格分隔
-d delimiter ?持續讀取直到遇到 delimiter 第一個字符退出
-i text ?將 test 文本作為
-n nchars ?讀取 nchars 個字符返回,而不是等到換行符
-N nchars ?讀取 nchars 個字符返回,除非遇到文件結束符或超時,其他分隔符都被忽略
-p prompt ?提示信息
-t timeout ?等待超時時間,秒
-u fd ?指定文件描述符號碼作為輸入,默認是 0
name ?變量名
示例:
獲取用戶輸入保存到變量:
# read -p "Please input your name: " VAR
Please input your name: lizhenliang
# echo $VAR
lizhenliang
用戶輸入保存為數組:
# read -p "Please input your name: " -a ARRAY
Please input your name: a b c
# echo ${ARRAY[*]}
a b c
遇到 e 字符返回:
# read -d e VAR
123
456
e
# echo $VAR
123 456
從文件作為 read 標準輸入:
# cat a.txt
adfasfd
# read VAR < a.txt
# echo $VAR
adfasfd
while 循環讀取每一行作為 read 的標準輸入:
# cat a.txt |while read LINE; do echo $LINE; done
123
abc
分別變量賦值:
# read a b c
1 2 3
# echo $a
1
# echo $b
2
# echo $c
3
# echo 1 2 3 | while read a b c;do echo "$a $b $c"; done
1 2 3
謝謝觀看,真心的希望能幫到您!