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]#
原文链接:https://www.f2er.com/bash/390958.html