2007年8月8日星期三

GNU/Linux 指令 read


指令名稱:
read(1) - 讀取標準輸入,作為變數內容(bash shell 內建指令)
語法:
read [-ers] [-u fd] [-t timeout] [-a aname] [-p prompt] [-n nchars] [-d delim] [name ...]
說明:
read 這個內建指令在交談模式下,極少用到,但在撰寫 shell script 時卻時常少不了她。當 shell scrip 需要與執行者進行"交談"並讀取執行者所鍵入的資料,read 就派上用場了。

指令負責讀取標準輸入的輸入。被讀取的第一個引數指定給第一個變數,第二個引數指定給第二個變數,以下類推。如果對應也所剩餘,則剩餘的引數會全部給最後一個變數。如果對應有所不足,沒有引數對應的變數其內容為空。
選項:
-a aname
讀取標準輸入到指定的陣列變數(aname)。值由 0 開始計算。陣列變數在讀取資料前會自動清空容。
-d delim
用 delim 指定第一個字元(所以需入一個字元即可),來做為結束輸入的字元。
-e
假使標準輸入來自終端機,使用 readline 讀取。
-n nchars
在讀取指定的字元數後,自動結束。
-p prompt
以標準錯誤顯示指定的提示。同時 newline 省略。
-r
關閉符號倒斜線的 escape 定義。
-s
沉默模式,從終端機讀取字元時不回應任何顯示。
-t timeout
設定輸入的時間限制,單位秒。當超過時限未輸入資料,read 將自動終結,執行狀態值為 1。
-u fd
從檔案描述 fd 讀取輸入。
實例說明:
預設的引數與變數對應關係

# cat read00
#!/bin/bash
read -p "S/N: " sn1 sn2 sn3
echo "sn1 $sn1"
echo "sn2 $sn2"
echo "sn3 $sn3"
#

上例是個非常簡單的 script。指令 read 指定了 sn1 sn2 sn3 三個變數來接收標準輸入的引數。以下是執行的情況

# read00
S/N: 00 11 22 33
sn1 00
sn2 11
sn3 22 33

## read00
S/N: 00 11
sn1 00
sn2 11
sn3
#

使用 echo 所輸出的,就是鍵入的引數與 sn1, sn2, sn3 變數的對應結果。這是 read 指令預設的做法。

陣列變數的使用

# cat read-a
#!/bin/bash
read -p "S/N: " -a sn
echo "sn0 ${sn[0]}"
echo "sn1 ${sn[1]}"
echo "sn2 ${sn[2]}"
#

read 指令支援 -a 選項用來宣告陣列變數。上例是,基本的使用與呼叫,以下是執行的情況。

# read-a
S/N: 11 22 33 44
sn0 11
sn1 22
sn2 33
#

設定輸入的時間限制

選項 -t 支援"限時"的功能,這對偷懶或做到一半喜歡亂跑的執行者來說,是個不錯的功能。在下例中,我設定的5秒的時間,一旦超過這個時間沒有輸入,script 會自動終止執行。

# cat read-t
#!/bin/bash
read -p "Any pattern keyin, 5 second, please. :: " -t 5 sn1
if [ "$?" = 1 ]
then
echo "TimeOut, Sorry."
exit 1
fi
echo -n "md5 id: "
echo "$sn1" | md5sum - | colrm 33
exit 0
#

來看看她逾時不候的情況及正常的執行狀態

# read-t
Any pattern keyin, 5 second, please. :: TimeOut, Sorry.
#

# read-t
Any pattern keyin, 5 second, please. :: deke
md5 id: eb2dde2422a2044de4ab8348e147c6f5
#

自訂輸入終止字元

一般情況下,我們都是以 return 來終止資料的輸入。但,如果有一天,我們 return 字元也是資料輸入的一部分時,怎麼辦?

選項 -d 可以幫我們解決這個問題。

# cat read-d
#!/bin/bash
echo "Keyin any number (Type . to end your input.)"
read -d . kk
echo "(end)"
echo $kk
#

上例,我指定符號 . 來做為輸入終止的符號。因此在輸入數字時,使用 return 就不會中斷我的輸入了。這對某些輸入提供了相當的便利性。

# read-d
Keyin any number (Type . to end your input.)
838393
985939
399230
399590
939939.(end)
838393 985939 399230 399590 939939
#

限定輸入字元數

使用 -n 選項,可以讓我們控制輸入的字元數,當輸入到設定的字元數目時,read會自動終結。

# cat read-n
#!/bin/bash
echo "Keyin your ID: "
read -n 9 eu
echo -e "\n\nyour ID: $eu"
#

在 script 撰寫中 read 算是一個相當常用的指令,以上的幾種型態的運用,算是 script 撰寫的基礎。這篇暫時到此。

没有评论: