read
命令是bash內(nèi)置命令,可從標(biāo)準(zhǔn)輸入或者文件描述符中讀取一行并將該行按空格拆分為多個(gè)字符串賦值給多個(gè)變量。
第一個(gè)字符串賦值給第一個(gè)變量,第二個(gè)字符串賦值給第二個(gè)變量,依此類推。如果沒有為read
命令提供變量名稱,將整行賦值給REPLY
變量。
在本教程中,我們將說明如何在Linux使用read
命令讀取用戶的輸入并保存到多個(gè)變量中。
read 命令
read命令語法形式是read [options] [name...]
。為了簡(jiǎn)單說明read
命令的工作方式,請(qǐng)按快捷鍵CTRL+ALT+T
打開終端,運(yùn)行命令read var1 var2
。
read
命令將會(huì)等待用戶輸入。可以輸入任意兩個(gè)字符串并使用空格進(jìn)行分隔,例如輸入Hello World
。輸入完成后按Enter。
你將會(huì)發(fā)現(xiàn)read
命令將Hello
字符串分配給變量var1
,World
字符串賦值給變量var2
。我們可以運(yùn)行命令echo
或printf
驗(yàn)證打印變量驗(yàn)證這一點(diǎn)。
read var1 var2
echo $var1
ehco $var1
Hello
World
如果沒有為read
命令提供變量名稱,則將整行分配給REPLY
變量。你可以再次終端運(yùn)行命令read
。
接著輸入任意字符串,也可以繼續(xù)輸入Hello World
來驗(yàn)證這一點(diǎn)。最后運(yùn)行命令echo $REPLY
打印$REPLY
。
read
echo $REPLY
Hello World
如果為read
命令指定的變量名稱大于用戶輸入并按空格拆分后字符串?dāng)?shù)量,其余變量名稱將不會(huì)被賦值。
如果為read
命令指定的變量名稱小于用戶輸入并按空格拆分后字符串?dāng)?shù)量,其余字符串將賦值給最后一個(gè)變量名稱。
例如命令echo "Hello" | (read var1 var2; echo -e "Var1: $var1 Var2: $var2")
。
當(dāng)你運(yùn)行命令echo $var1
打印變量var1時(shí),將會(huì)打印字符串Hello。命令echo $var2
打印空的輸出。
#小于
echo "Hello" | (read var1 var2; echo -e "Var1: $var1
Var2: $var2")
#大于
echo "www myfreax com" | (read var1 var2; echo -e "Var1: $var1
Var2: $var2")
read 命令分隔符
read
命令默認(rèn)使用一個(gè)或多個(gè)空格,制表符和換行符作為分隔符,拆分字符串為多個(gè)字符串,然后分配給多個(gè)變量名稱。
如果要使用其它分隔符拆分字符串,請(qǐng)將要作為分隔符的字符賦值給IFS
變量。例如命令IFS=":"
將IFS
變量設(shè)置為:
。
echo "Linux:is:awesome." | (IFS=":" read -r var1 var2 var3; echo -e "$var1
$var2
$var3")
Linux
is
awesome.
如果用戶輸入字符串連續(xù)包含多個(gè)IFS
變量指定的分隔符號(hào)。read命令將會(huì)在兩個(gè)彼此相鄰的分隔符,生成空值分配給變量。
例如IFS
變量指定的分隔符號(hào)是:
,而用戶輸入的是Linux::is:awesome.
。read命令將會(huì)在::
之間生成一個(gè)空值分配給變量。
echo "Linux::is:awesome." | (IFS=":" read -r var1 var2 var3 var4; echo -e "Var1: $var1
Var2: $var2
Var3: $var3
Var4: $var4")
Var1: Linux
Var2:
Var3: is
Var4: awesome.
read
命令還允許您使用多個(gè)分隔符號(hào)來拆分字符串。當(dāng)指定多個(gè)分隔符號(hào)時(shí),請(qǐng)將分隔符分配給IFS
變量,并且在它們之間沒有空格。
例如命令IFS="-_"
使用_
和-
作為分隔符,
echo 'Linux_is-awesome.' | (IFS="-_" read -r var1 var2 var3; echo -e "$var1
$var2
$var3")
Linux
is
awesome.
read 命令組合echo與管道
您可以使用其他方法將標(biāo)準(zhǔn)輸入傳遞給read
命令,例如管道,here-string或heredoc。而不是在標(biāo)準(zhǔn)輸入的默認(rèn)方式鍵盤。
例如命令echo "Hello, World!" | (read var1 var2; echo -e "$var1 $var2")
。這里之所以使用括號(hào)括起read
和echo
命令。
是因?yàn)楣艿赖挠覄t是在Shell的子進(jìn)程運(yùn)行的,如果沒有括號(hào)命令echo -e "$var1 $var2"
并不是和read命令同一進(jìn)程運(yùn)行。就會(huì)導(dǎo)致兩個(gè)變量輸出都是空。
echo "Hello, World!" | (read var1 var2; echo -e "$var1
$var2")
Hello,
World!
read 命令組合HereDoc
默認(rèn)情況下,read
命令將反斜杠解釋為轉(zhuǎn)義符,有時(shí)可能會(huì)導(dǎo)致意外行為。要禁用反斜杠轉(zhuǎn)義,請(qǐng)使用read
命令的-r
選項(xiàng)。
在使用read
命令時(shí),您應(yīng)該始終與read
命令的-r
選項(xiàng)一起使用。你可以運(yùn)行命令read <<< "Hello, World!"
與命令read -r <<< "Hello, World!"
。
驗(yàn)證在使用read
的-r
選項(xiàng)和沒有-r
選項(xiàng)時(shí)的區(qū)別。
read <<< "Hello, World!"
read -r <<< "Hello, World!"
Hello, tWorld!
Hello, World!
read 命令提示消息
當(dāng)編寫交互式Shell腳本時(shí),可以使用read
命令獲取用戶輸入。您還可以使用read
命令的-p
選項(xiàng),打印一條提示消息告知用戶當(dāng)前輸入在做什么操作。
如果Shell腳本要求用戶輸入敏感信息,例如密碼,可以使用read命令-s
選項(xiàng)隱藏用戶的輸入。
例如命令read -r -s -p "Enter your password: "
詢問用戶的密碼并隱藏在終端的輸出。
read -r -p "Are you sure?"
read -r -s -p "Enter your password: "
通常,您可以在while
循環(huán)內(nèi)使用read
命令來強(qiáng)制用戶提供預(yù)期的答案之一。shutdown.sh腳本將提示用戶重啟系統(tǒng)。
while true; do
read -r -p "Do you wish to reboot the system? (Y/N): " answer
case $answer in
[Yy]* ) reboot; break;;
[Nn]* ) exit;;
* ) echo "Please answer Y or N.";;
esac
done
shutdown.sh
read 命令數(shù)組字符串
要將read命令拆分后的字符串分配給數(shù)組,而不是變量名稱,請(qǐng)使用read命令的-a
選項(xiàng)。
read -r -a MY_ARR <<< "Linux is awesome."
for i in "${MY_ARR[@]}"; do
echo "$i"
done
Linux
is
awesome.
結(jié)論
read
命令用于將讀取用戶輸入行拆分為單詞。
-
Linux
+關(guān)注
關(guān)注
87文章
11345瀏覽量
210389 -
字符串
+關(guān)注
關(guān)注
1文章
585瀏覽量
20601 -
命令
+關(guān)注
關(guān)注
5文章
696瀏覽量
22108 -
Read
+關(guān)注
關(guān)注
0文章
10瀏覽量
11129
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論