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]#
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]#