14.2 讀取使用者輸入
14.2.1 變數
上一章我們談到如何定義或取消變數,變數可被設定為當前shell的局部變數,或是環境變數。如果您的shell指令碼不需要調用其他指令碼,其中的變數通常設定為指令碼內的局部變數(參見第13.10節“變數”)。
要擷取變數的值,在美元符後跟變數名即可。shell會對雙引號內的美元符後的變數執行變數擴充,單引號中的美元符則不會被執行變數擴充。
範例14-3
1 name="John Doe" or declare name="John Doe" # local variable
2 export NAME="John Doe" # global variable
3 echo "$name" "$NAME" # extract the value 14.2.2 read命令
read命令是一個內建命令,用於從終端或檔案讀取輸入(參見表14-1)。read命令讀取一個輸入行,直至遇到分行符號。行尾的分行符號在讀入時將被轉換成一個Null 字元。如果read命令後未跟變數名,讀入的行將被賦給內建變數REPLY。也可以用read命令來中斷程式的運行,直至使用者輸入一個斷行符號鍵。要知道如何有效地使用read命令從檔案讀取輸入行,請參見14.6節的“迴圈控制命令”。如果帶-r選項,read命令將忽略反斜線/分行符號對,而把反斜線作為行的一部分。read命令有4個控制選項:-a,-e,-p,-r②。
表14-1 read命令
格 式 |
含 義 |
read answer |
從標準輸入讀取一行並賦值給變數answer |
read first last |
從標準輸入讀取一行,直至遇到第一個空白符或分行符號。把使用者鍵入的第一個詞存到變數first中,把該行的剩餘部分儲存到變數last中 |
read |
標準輸入讀取一行並賦值給內建變數REPLY |
read –a arrayname |
讀入一組詞,依次賦值給數組arrayname③ |
(續表)
格 式 |
含 義 |
read -e |
在互動式shell命令列中啟用編輯器。例如,如果編輯器是vi,則可以在輸入行時使用vi命令③ |
read –p prompt |
列印提示符,等待輸入,並將輸入賦值給REPLY變數③ |
read –r line |
允許輸入包含反斜線③ |
範例14-4
(指令碼)
#!/bin/bash
# Scriptname: nosy
echo -e "Are you happy? \c"
1 read answer
echo "$answer is the right response."
echo -e "What is your full name? \c"
2 read first middle last
echo "Hello $first"
echo –n "Where do you work? "
3 read
4 echo I guess $REPLY keeps you busy!
-------------------------------------------------------④
5 read -p "Enter your job title: "
6 echo "I thought you might be an $REPLY."
7 echo -n "Who are your best friends? "
8 read -a friends
9 echo "Say hi to ${friends[2]}."
-------------------------------------------------------
(輸出)
$ nosy
Are you happy? Yes
1 Yes is the right response.
2 What is your full name? Jon Jake Jones
Hello Jon
3 Where do you work? the Chico Nut Factory
4 I guess the Chico Nut Factory keeps you busy!
5 Enter your job title: Accountant
6 I thought you might be an Accountant.
7,8 Who are your best friends? Melvin Tim Ernesto
9 Say hi to Ernesto.
說明
1. read命令接收一行使用者輸入,將其值賦給變數answer。
2. read命令從使用者處接收輸入,將輸入的第一個詞賦給變數first,將第二個詞賦給變數middle,然後將直到行尾的所有剩餘單詞都賦給變數last。
3. 從標準輸入讀取一行,賦值給內建變數REPLY。
4. 顯示變數REPLY的值。
5. 帶-p選項的read命令,顯示提示“Enter your job title:”,把輸入行賦值給特定內建變數REPLY。
6. 在字串中顯示變數REPLY的值。
7. 請求使用者輸入。
8. 帶-a選項的read命令將輸入當作一組片語成的數組,數組名為friends,讀入數組的元素是Melvin、Tim和Ernesto。
9. 顯示friends數組的第3個元素。數組下標從0開始。