一、讀取用戶輸入
(1)基本的讀取命令
read命令接受從標准輸入或文件描述符的輸入,並將接收到的數據賦值到一個變量。
1 $ cat read.sh 2 #!/bin/bash 3 # test the read command 4 echo -n "please input your name: " 5 read name 6 echo "Hello $name"
read命令的-p選項,可以直接在read命令行指定提示符,如上一例子可以寫為
read -p "please input your name: " name
read可以接收多個用戶輸入值,並賦值到多個變量,如果變量表在數據之前用完,則剩下的數據就會分配到最后一個變量
read -p "please input your name: " first last echo "Hello $first.$last"
如果在read命令行不指定變量,read命令將會把用戶輸入的數據放入特殊環境變量REPLY中。
(2)讀取超時
read命令使用時,如果用戶沒有輸入會一直等待;使用-t選項可以指定超時時間,單位為秒。
讀取超時后,read命令會返回一個非0的狀態退出碼。如:
read -t 5 -p "please input your name: " name
可以使用-n選項指定讀取的字符數,read命令讀取到相應字符后會自動退出,不需回車。
(3)隱藏方式讀取
需要讀取用戶輸入,但不希望輸入顯示在屏幕上,可以使用-s選項。
read -t 5 -s -p "please input your passwd: " passwd
二、輸入輸出重定向
(1)標准文件描述符
linux系統將每個對象當作文件來處理,使用文件描述符來標識每個文件對象。文件描述符是一個非負數,可以唯一標識回話中打開的文件。每個過程最多可以有9個文件描述符。bash shell保留了3個文件描述符0、1和2。
0 — STDIN — 標准輸入
1 — STDOUT — 標准輸出
2 — STDERR — 標准錯誤
一般命令的標准輸入是鍵盤,標准輸出和標准錯誤的輸出是屏幕。
使用 < 重定向標准輸入,使用 > 重定向標准輸出。
(2)重定向錯誤
使用重定向時,若產生錯誤,如
ls -l badfile > test ls: 無法訪問badfile: 沒有那個文件或目錄
錯誤提示輸出到屏幕上,test文件被創建,但是為空。
如果希望將錯誤提示輸出到文件中,需要在重定向符號>前加上標准錯誤的描述符2
ls -l badfile 2> test $ cat test ls: 無法訪問badfile: 沒有那個文件或目錄
如果需要將標准輸出和標准錯誤都重定向到文件,需要分開處理,如:
ls -l goodfile badfile 2> test_err 1> test
這樣可以將錯誤提示和標准輸出重定向到不同的文件中。
bash shell提供了特殊的重定向符&> 可以將STDERR和STDOUT的輸出重定向到同一文件中。
(3)在腳本中重定向輸出
臨時重定型:如果需要將STDOUT的消息轉換成STDERR的輸出,可以通過在輸出的行后加 <&2
echo "this is a error message" >&2
這樣這行命令的輸出則會顯示在STDERR文件描述符所指向的任何位置,而不再是STDOUR。
永久重定向:可以通過exec命令告訴shell腳本執行期間重定向某個特定的文件描述符。
1 #!/bin/bash 2 #redirecting alloutput 3 exec 1>testfile 4 echo "this is a test of redirecting alloutput"
(4)在腳本中重定向輸入
exec命令允許將STDIN重定向到文件中,如:
exec 1< file
這個命令告訴shell需要從file中獲取輸入,而不是STDIN。
1 #!/bin/bash 2 #redirecting file input 3 exec 0< testfile 4 count=1 5 while read line; do 6 echo "Line #$count: $line" 7 count=$[ $count + 1 ] 8 done
當運行read命令時,不再需要用戶通過鍵盤輸入,而是直接從testfile文件中讀取數據。