您的位置:首页 > 运维架构 > Shell

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

2017-09-06 00:04 423 查看
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]# 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: