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

来源:互联网 发布:mr消音软件 编辑:程序博客网 时间:2024/05/17 23:08
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]# 





原创粉丝点击