shell read變量的讀入
shell變量的輸入:
shell變量除了可以直接賦值或腳本傳參外,還可以使用read命令從標準輸入獲取,read為bash內置命令,可以通過help read查看幫助。
語法格式:
read 【參數】 【變量名】
常用參數:
-p :設置提示信息
-t :設置輸入等待的時間,單位默認為秒。
測試:read的基本讀入
read -t 5 -p "Pls input two number:" a1 a2 #超時5秒後退出
例如:我們可以寫一個加減乘除計算腳本,以read方式讀入整數變量:
簡單腳本:
1 [root@bqh-117 scripts]# cat js.sh2 #!bin/sh 3 read -t 15 -p "input two number:" a b 4 echo $a-$b=$(($a-$b)) 5 echo $a+$b=$(($a+$b)) 6 echo $a*$b=$(($a*$b)) 7 echo $a/$b=$(($a/$b)) 8 echo $a**$b=$(($a**$b)) 9 echo $a%$b=$(($a%$b)) 10 [root@bqh-117 scripts]# sh js.sh 11 input two number:8 4 12 8-4=4 13 8+4=12 14 8*4=3215 8/4=2 16 8**4=4096 17 8%4=0
定義變量是也可以:
read –t 15 –p ” please input two number:” num1 num2
a=$num1
b=$num2
利用echo命令替代read –p的功能:
echo -n ” please input two number:” a b
read a b
思考:如果前面的範例腳本中讀入的不是整數或者輸入的數字個數不是2個,執行腳本會什麽結果?如何解決?
解答:
上述程序可以如下思考解決:
可以模擬打遊戲過關的思路,設置關卡,滿足一項要求則過關,否則,game over!
第一關:用戶按要求輸入了為兩個值則過關,否則,game over。
編程提示:可以用變量的字符串長度判斷,例如:${#bqh}
第二關:用戶輸入的內容均為整數才過關,否則 game over
編程提示:用expr特殊技巧進行判斷
第三關:當讀入的參數符合個數和整數條件後,進行計算。
----------------------------------------------------------------------------------------------------------------------
方法一:read讀入
1 [root@bqh-117 scripts]# vim read_js.sh 2 3 #/bin/sh 4 read -t 8 -p "please input two number:" a b #a前面要有空格 5 #no.1 6 [ -z "$a" ]&&{ echo "first number must be int." 7 exit 1 8 } 9 [ -z "$b" ]&&{ echo "second number must be int." 10 exit 2 11 } 12 #no.2 13 expr $a + $b + 1 &>/dev/null 14 [ $? -ne 0 ]&&{ echo "the number you input must be int." 15 exit 3 16 } 17 #no.3 18 echo "$a-$b =$(($a-$b))" 19 echo "$a+$b =$(($a+$b))" 20 echo "$a*$b =$(($a*$b))" 21 if [ $b -eq 0 ];then 22 echo "fenmu can not be 0,s0 /,% can not yunsuan." 23 else 24 echo "$a/$b =$(($a/$b))" 25 echo "$a%$b =$(($a%$b))" 26 fi 27 echo "$a**$b =$(($a**$b))"
測試效果如下:
方法二:read讀入
1 [root@bqh-117 scripts]# vim read_js1.sh 2 #!/bin/sh 3 while true 4 do 5 read -t 8 -p "pls input two number:" a b 6 expr $a + 0 >/dev/null 2>&1 7 [ $? -ne 0 ]&& continue 8 expr $b + 0 >/dev/null 2>&1 9 [ $? -ne 0 ]&& continue || break 10 done 11 echo "$a-$b =$(($a-$b))" 12 echo "$a+$b =$(($a+$b))" 13 echo "$a*$b =$(($a*$b))" 14 echo "$a/$b =$(($a/$b))" 15 echo "$a**$b =$(($a**$b))" 16 echo "$a%$b =$(($a%$b))"
測試效果:
思考:如何將上述read讀入改成腳本傳參的方式實現?
解答:
方法一:
[root@bqh-117 scripts]# vim read_js3.sh
#!/bin/sh
a=$1
b=$2
Usage() {
echo "USAGE: number 1 number 2"
exit 1
}
if [ $# -ne 2 ];then
Usage
fi
[ "`echo "$a"|sed -r ‘s#[^0-9]##g‘`" = "$a" ]||{
echo "number 1 must be int."
exit 2
}
[ "`echo "$b"|sed -r ‘s#[^0-9]##g‘`" = "$b" ]||{
echo "number 2 must be int."
exit 3
}
echo "$a-$b =$(($a-$b))"
echo "$a+$b =$(($a+$b))"
echo "$a*$b =$(($a*$b))"
echo "$a/$b =$(($a/$b))"
echo "$a**$b =$(($a**$b))"
echo "$a%$b =$(($a%$b))"
測試效果:
方法二:
1 [root@bqh-117 scripts]# vim read_js2.sh 2 #!/bin/sh 3 a=$1 4 b=$2 5 Usage() { 6 echo "USAGE: number 1 number 2" 7 exit 1 8 } 9 if [ $# -ne 2 ];then 10 Usage 11 fi 12 expr $a + 0 &>/dev/null 13 fetval1=$? 14 expr $b + 0 &>/dev/null 15 fetval2=$? 16 test $fetval1 -eq 0 -a $fetval2 -eq 0 ||{ 17 echo "pls input two number 1 and number 2 must be int." 18 Usage 19 } 20 echo "$a-$b =$(($a-$b))" 21 echo "$a+$b =$(($a+$b))" 22 echo "$a*$b =$(($a*$b))" 23 echo "$a/$b =$(($a/$b))" 24 echo "$a**$b =$(($a**$b))" 25 echo "$a%$b =$(($a%$b))"
測試效果:
當然還有很多其他方法等等。
shell read變量的讀入