shell学习十二--变量输入read

read shell变量除了可以直接赋值和脚本传参外,还可以使用read命令从标准输入获得。 read内置命令,通过help read查看帮助 作用:从标准输入中读取一行 语法 read [ -p ][ -r ][ -s ][ -u[ n ] ] [ VariableName?Prompt ] [ VariableName ... 描述 read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量,用 IFS(内部字段分隔符)变量中的字符作为分隔符。 VariableName参数指定 shell 变量的名称,shell 变量获取输入行一个字段的值 由VariableName 参数指定的第一个 shell 变量指定给第一个字段的值,由 VariableName 参数指定的第二个shell 变量指定给第二个字段的值,以此类推,直到最后一个字段。如果标准输入行的字段比相应的由 VariableName 参数指定的 shell 变量的个数多,把全部余下的字段的值赋给指定的最后的 shell 变量。如果比 shell 变量的个数少,则剩余的 shell 变量被设置为空字符串。 注意: 如果省略了 VariableName 参数,变量 REPLY 用作缺省变量名。 由 read 命令设置的 shell 变量影响当前 shell 执行环境。 注: -p 标志的文件结束符引起该进程的清除,因此产生另外一个进程。 -r 指定读取命令把一个 \ (反斜杠) 处理为输入行的一部分,而不把它作为一个控制字符。 -s 把输入作为一个命令保存在 Korn shell 的历史记录文件中。 -u [ n ] 读取一位数的文件描述符号码 n 作为输入。文件描述符可以用 ksh exec 内置命令打开。n 的缺省值是 0,表示的是键盘。值 2 表示标准错误。 -t 超时退出 例子1: [root@node01 day4]# read -t 5 -p "Pls input:" a Pls input:[root@node01 day4]# 5秒钟为输入,自动退出 [root@node01 day4]# read -t 5 -p "Pls input:" a Pls input:[root@node01 day4]# read -t 5 -p "Pls input:" a Pls input:22 [root@node01 day4]# echo $a 22 [root@node01 day4]# read -t 5 -p "Pls input:" a b Pls input:33 33 [root@node01 day4]# echo $b 33 [root@node01 day4]# echo $a 33 上面read -p的功能可以用echo和read实现 例子2: 把之前的计算器修改为read输入 [root@node01 day4]# vi read.sh #!/bin/sh #a=$1 #b=$2 read -t 10 -p "input number:" 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))” echo “a%b =$(($a%$b))” echo “a%b =$(($a%$b))” [root@node01 day4]# sh read.sh input number:10 8 “a-b =2” “a+b =18” “a*b =80” “a/b =1” “a**b =100000000” “a%b =2” “a%b =2” 例子3: 开发shell脚本分别实现以定义变量,脚本传参以及read读入的方式比较2个整数大小,用条件表达式(禁止if) 进行判断并以屏幕输出的方式提醒用户比较结果。 注意:一共是3个脚本。当用脚本传参以及read读入的方式需要对变量是否为数字做判断。 [root@node01 day4]# vi read_01.sh #!/bin/bash read -p "Pls input two number:" a b #no1 #[ -z "$a" ] || [ -z "$b" ] &&{ [ -z "$a" ] || [ -z "$b" ] && { echo "Pls input two num again." exit 1 } #no2 expr $a + 10 &>/dev/null RETVAL1=$? expr $B + 10 &>/dev/null RETVAL2=$? test $RETVAL1 -eq 0 -a $RETVAL2 -eq 0 ||{ echo "Pls input two no again." exit 2 } #no3 [ $a -lt $b ] &&{ echo "$a < $b" exit 0 } [ $a -eq $b ] &&{ echo "$a = $b" exit 0 } [ $a -gt $b ] &&{ echo "$a > $b" exit 0 } [root@node01 day4]# sh read_01.sh Pls input two number:1 2 1 < 2 [root@node01 day4]# sh read_01.sh Pls input two number:1 1 1 = 1 [root@node01 day4]# sh read_01.sh Pls input two number:1^H Pls input two num again. [root@node01 day4]# sh read_01.sh Pls input two number:1 0 1 > 0 换成传参方式 [root@node01 day4]# cp read_01.sh arg.sh [root@node01 day4]# vi arg.sh #!/bin/bash #read -p "Pls input two number:" a b a=$1 b=$2 #no1 #[ -z "$a" ] || [ -z "$b" ] &&{ [ -z "$a" ] || [ -z "$b" ] && { echo "Pls input two num again." exit 1 } #no2 expr $a + 10 &>/dev/null RETVAL1=$? expr $B + 10 &>/dev/null RETVAL2=$? test $RETVAL1 -eq 0 -a $RETVAL2 -eq 0 ||{ echo "Pls input two no again." exit 2 } #no3 [ $a -lt $b ] &&{ echo "$a < $b" exit 0 } [ $a -eq $b ] &&{ echo "$a = $b" exit 0 } [ $a -gt $b ] &&{ echo "$a > $b" exit 0 "arg.sh" 39L,473C written [root@node01 day4]# sh arg.sh 1 2 1 < 2 [root@node01 day4]# sh arg.sh 1 3 1 < 3 [root@node01 day4]# sh arg.sh 1 1 1 = 1 [root@node01 day4]# sh arg.sh 2 1 2 > 1 [root@node01 day4]# sh arg.sh 2 Pls input two num again. [root@node01 day4]# sh arg.sh 2 df arg.sh: line 25: [: df: integer expression expected arg.sh: line 30: [: df: integer expression expected arg.sh: line 35: [: df: integer expression expected 如果使用传参的话,判断更简单 [root@node01 day4]# vi r.sh #!/bin/bash #read -p "Pls input two num:" a b a=$1 b=$2 #no1 #[ -z "$a" ] || [ -z "$b" ] && { [ $# -ne 2 ]&&{ $# 这个脚本的参数个数 #echo "Pls input two num again." echo "USAGE:$0 NUM01 NUM02" exit 1 } #no2 expr $a + 10 &>/dev/null RETVAL1=$? expr $b + 10 &>/dev/null RETVAL2=$? test $RETVAL1 -eq 0 -a $RETVAL2 -eq 0 ||{ echo "pls input two "num" again." exit 2 } #num3 [ $a -lt $b ] &&{ echo "$a < $b" } #num4 [ $a -eq $b ] &&{ echo "$a = $b" } #num5 [ $a -gt $b ] &&{ echo "$a > $b" } echo "Usage: `basename $0` $script_parameters" Usage: 到这里都只是字符串,会直接显示成 Usage: `basename $0` 这句会先执行,然后把结果返回到这个echo 里面来 basename应该是一个方法,$0是传入到这个shellscript中的第一个参数 $script_parameters 另一个变量,放在字符串中,echo时会显示变量的值 例子4:制作一个菜单 [root@node01 day4]# vi menu1.sh #!/bin/bash cat <<END 1.first 2.tow END [root@node01 day4]# sh menu1.sh 1.first 2.tow [root@node01 day4]# [root@node01 day4]# vi menu2.sh #!/bin/bash menu(){ cat <<END 1.[install jdk] 2.[install Nginx] 3.[install tomcat] 4.[install redis] 5.[install MysqL] 6.[install mongodb] pls input the num you want: END } menu [root@node01 day4]# sh menu2.sh 1.[install jdk] 2.[install Nginx] 3.[install tomcat] 4.[install redis] 5.[install MysqL] 6.[install mongodb] pls input the num you want: [root@node01 day4]# vi menu2.sh read -t 15 a #!/bin/bash menu(){ cat <<END 1.[install jdk] 2.[install Nginx] 3.[install tomcat] 4.[install redis] 5.[install MysqL] 6.[install mongodb] pls input the num you want: END read -t 15 a } menu [ $a -eq 1 ]&&{ echo "installing jdk" sleep 3 echo "jdk is installed" menu } [root@node01 day4]# sh menu2.sh 1.[install jdk] 2.[install Nginx] 3.[install tomcat] 4.[install redis] 5.[install MysqL] 6.[install mongodb] pls input the num you want: 1 installing lamp lamp is installed 1.[install jdk] 2.[install Nginx] 3.[install tomcat] 4.[install redis] 5.[install MysqL] 6.[install mongodb] pls input the num you want: 2 [root@node01 day4]# [root@node01 day4]# cat menu2.sh #!/bin/bash menu(){ cat <<END 1.[install jdk] 2.[install Nginx] 3.[install tomcat] pls input the num you want: END #read -t 15 a } menu read -t 15 a [ $a -eq 1 ]&&{ echo "installing jdk" sleep 3 echo "jdk is installed" exit } [ $a -eq 2 ]&&{ echo "installing Nginx" sleep 3 echo "Nginx is installed" exit } [ $a -eq 1 ]&&{ echo "installing tomcat" sleep 3 echo "tomcat is installed" exit } [root@node01 day4]# sh menu2.sh 1.[install jdk] 2.[install Nginx] 3.[install tomcat] pls input the num you want: 1 installing jdk jdk is installed [root@node01 day4]# 加一个判断 [root@node01 day4]# vi menu2.sh #!/bin/bash menu(){ cat <<END 1.[install jdk] 2.[install Nginx] 3.[install tomcat] pls input the num you want: END #read -t 15 a } menu read -t 15 a [ $a -eq 1 ]&&{ echo "installing jdk" sleep 3 echo "jdk is installed" exit } [ $a -eq 2 ]&&{ echo "installing Nginx" sleep 3 echo "Nginx is installed" exit } [ $a -eq 1 ]&&{ echo "installing tomcat" sleep 3 echo "tomcat is installed" exit } [ ! $a -eq 1 -o ! $a -eq 2 -o ! $a -eq 3 ]&&{ 判断 echo "bye" exit } "menu2.sh" 34L,494C written [root@node01 day4]# sh menu2.sh 1.[install jdk] 2.[install Nginx] 3.[install tomcat] pls input the num you want: 1 installing jdk jdk is installed [root@node01 day4]# sh menu2.sh 1.[install jdk] 2.[install Nginx] 3.[install tomcat] pls input the num you want: 4 bye [root@node01 day4]# vi menu2.sh #!/bin/bash menu(){ cat <<END 1.[install jdk] 2.[install Nginx] 3.[install tomcat] pls input the num you want: END #read -t 15 a } menu read -t 15 a [ $a -eq 1 ]&&{ echo "installing jdk" sleep 3 echo "jdk is installed" exit } [ $a -eq 2 ]&&{ echo "installing Nginx" sleep 3 echo "Nginx is installed" exit } [ $a -eq 1 ]&&{ echo "installing tomcat" sleep 3 echo "tomcat is installed" exit } #[ ! $a -eq 1 -o ! $a -eq 2 -o ! $a -eq 3 ]&&{ [ "$a" != 1,2,3 ]&&{ 不等于也可以 echo "bye" exit } "menu2.sh" 35L,516C written [root@node01 day4]# sh menu2.sh 1.[install jdk] 2.[install Nginx] 3.[install tomcat] pls input the num you want: 4 bye [root@node01 day4]# 例子5:多级菜单 [root@node01 day4]# cat menu3.sh #!/bin/bash menu1(){ cat <<END ******************** 1.[install web] 2.[install db] 3.[exit] Pls input the num you want: ******************** END } menu2(){ cat <<END ******************** 1.[install jdk] 2.[install Nginx] 3.[install tomcat] 4.[exit] Pls input the menu2 num you want: ******************** END } menu1 read num [ $num -eq 1 ]&&{ menu2 read num2 [ $num2 -eq 1 ]&&{ echo "start installing jdk." exit } } [root@node01 day4]# [root@node01 day4]# sh menu3.sh ******************** 1.[install web] 2.[install db] 3.[exit] Pls input the num you want: ******************** 1 ******************** 1.[install jdk] 2.[install Nginx] 3.[install tomcat] 4.[exit] Pls input the menu2 num you want: ******************** 1 start installing jdk. [root@node01 day4]#

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...