shell命令之read
簡介:
read命令從鍵盤讀取變量的值,通常用在shell腳本中與用戶進行交互的場合。該命令可以一次讀取多個變量的值,變量和輸入的值都需要使用空格隔開。在read命令後面,如果沒有指定變量名,讀取的數據將被自動賦值給特定的變量REPLY。
語法
read(選項)(參數
選項
Read可以帶有-a, -d, -e, -n, -p, -r, -t, 和 -s八個選項。
-a :將內容讀入到數值中
echo -n "Input muliple values into an array:"
read -a array
-d :表示delimiter,即定界符,一般情況下是以IFS為參數的間隔,但是通過-d,我們可以定義一直讀到出現執行的字符位置。例如read –d madfds value,讀到有m的字符的時候就不在繼續向後讀,例如輸入為 hello m,有效值為“hello”,請註意m前面的空格等會被刪除。這種方式可以輸入多個字符串,例如定義“.”作為結符號等等。
-e :只用於互相交互的腳本,它將readline用於收集輸入行。讀到這幾句話不太明白什麽意思,先跳過。
-n :用於限定最多可以有多少字符可以作為有效讀入。例如echo –n 4 value1 value2,如果我們試圖輸入12 34,則只有前面有效的12 3,作為輸入,實際上在你輸入第4個字符‘3’後,就自動結束輸入。這裏結果是value為12,value2為3。
-p :用於給出提示符,在前面的例子中我們使用了echo –n “…“來給出提示符,可以使用read –p ‘… my promt?’value的方式只需一個語句來表示。
-r :在參數輸入中,我們可以使用’/’表示沒有輸入完,換行繼續輸入,如果我們需要行最後的’/’作為有效的字符,可以通過-r來進行。此外在輸入字符中,我們希望/n這類特殊字符生效,也應采用-r選項。
-s :對於一些特殊的符號,例如箭頭號,不將他們在terminal上打印,例如read –s key,我們按光標,在回車之後,如果我們要求顯示,即echo,光標向上,如果不使用-s,在輸入的時候,輸入處顯示^[[A,即在terminal上 打印,之後如果要求echo,光標會上移。
-t :用於表示等待輸入的時間,單位為秒,等待時間超過,將繼續執行後面的腳本,註意不作為null輸入,參數將保留原有的值。
參數
變量:指定讀取值的變量名。
示例1:
從標準輸入讀取輸入並賦值給name
# read name
sxzhou
打印變量name
# echo $name
sxzhou
示例2:
-p指定提示符
# read -p "input your name: " name
input your name: sxzhou
# echo $name
sxzhou
示例3:
指定多個變量
# read -p "input animal name: " cat dog
input animal name: tom flower
# echo $cat
tom
# echo $dog
flower
示例4:
read 命令中不指定變量,那麽read命名將它收到的任何數據都放在特殊環境變量REPLY中
# read
this is reply
# echo $REPLY
this is reply
示例5:
利用REPLY求階乘
# vi product.sh
#!/bin/bash
read -p "Enter a number: "
product=1
for (( count=1; count<=$REPLY; count++ ))
do
product=$[ $product * $count ]
done
echo "The product of $REPLY is $product"
# sh product.sh
4
The product of 4 is 24
註意:
小括號和中括號符號和內容之間有空格
等號兩邊沒有空格
示例6:
超時測試 read -t
# vi overtime.sh
#!/bin/bash
if read -t 5 -p "Please enter your name: " name
then
echo "Hello $name, welcome!"
else
echo
echo "Sorry, too slow! please retry"
fi
五秒內輸入名字
# sh overtime.sh
Please enter your name:
sxzhou
Hello sxzhou, welcome!
五秒外
# sh overtime.sh
Please enter your name:
Sorry, too slow! please retry
示例7:
read命令對輸入進行判斷
# vi decide.sh
#!/bin/bash
read -n1 -p "Do you want to continue [Y(y)/N(n)] ?" answer
case $answer in
Y | y) echo
echo "fine, continue...";;
N | n) echo
echo "ok,goodbay"
exit;;
esac
# sh decide.sh
Do you want to continue [Y(y)/N(n)] ? y
fine, continue...
# sh decide.sh
Do you want to continue [Y(y)/N(n)] ? N
ok,goodbay
註:
-n1為限制輸入一個字符
示例8:
隱藏輸入 read -s
# vi hide.sh
#!/bin/bash
read -s -p "Enter your passwd: " pass
echo
echo "Is your passwd readlly $pass?"
# sh hide.sh
Enter your passwd: (輸入123456,不顯示)
Is your passwd readlly 123456?
示例9:
# vi text.sh
#!/bin/bash
count=1
cat hide.sh | while read line
do
echo "Line $count: $line"
count=$[ $count + 1 ]
done
echo "Finished processing the file"
# sh text.sh
Line 1: #!/bin/bash
Line 2: read -s -p "Enter your passwd: " pass
Line 3: echo
Line 4: echo "Is your passwd readlly $pass?"
shell命令之read