Read命令
1 定义
Read作用从键盘读入数据,赋给变量
参数用法
read answer 从标准输入读取一行并赋值给变量answer。
read first last 从标准输入读取一行,直至遇到第一个空白符或换行符,
把用户键入的第一个词存到变量first中,把该行的剩余部分保存到变量last中。
read –s passwd 将你输入的东西隐藏起来,值赋给passwd。
read –t 2 test 输入的时间限制。
read –n 2 test 输入的长度限制。
read –r line 允许输入包含反斜杠。
[hadoop@hadoop113 ~]$ read a b c
hello world jsperlee
[hadoop@hadoop113 ~]$ echo $a $b $c
hello world jsperlee
在shell中使用read命令
vi myinfo.sh
#!/bin/bash
read -p “请输入你的姓名:” NAME
read -p “请输入你的年龄:” AGE
read -p “请输入你的性别:” SEX
echo “你的基本信息如下:”
echo “姓名:$ NAME”
echo “年龄:$ AGE”
echo “性别:$SEX”
执行结果
[hadoop@hadoop113 ~]$ sh myinfo.sh
请输入你的姓名:jasperlee
请输入你的年龄:28
请输入你的性别:男
你的基本信息如下:
姓名:jasperlee
年龄:28
性别:男
变量测试语句
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
格式:test 测试条件
如果结果是对的,也叫结果为真,用$ ?=0表示,反之为假,用$?=1表示。
1、文件测试
参数 说明 示例
-e 文件名. 如果文件存在则为真 [ -e file ]
-r 文件名. 如果文件存在且可读则为真 [ -r file ]
-w 文件名. 如果文件存在且可写则为真 [ -w file ]
-x 文件名. 如果文件存在且可执行则为真 [ -x file ]
-s 文件名 .如果文件存在且至少有一个字符则为真 [ -s file ]
-d 文件名. 如果文件存在且为目录则为真 [ -d file ]
-f 文件名. 如果文件存在且为普通文件则为真 [ -f file ]
-c 文件名. 如果文件存在且为字符型特殊文件则为真 [ -c file ]
-b 文件名.. 如果文件存在且为块特殊文件则为真 [ -b file ]
案例:
[hadoop@hadoop111 ~]$ test -e clearlog.sh ;echo $ ?
0
[hadoop@hadoop111 ~]$ test -d data/ ;echo $ ?
0
[hadoop@hadoop111 ~]$ test -x lee.sh ;echo $ ?
0
[hadoop@hadoop111 ~]$ chmod 644 ua.sh
[hadoop@hadoop111 ~]$ test -x ua.sh;echo $?
1
2、数值测试
-eq 等于 应用与整数比较 equal
-ne 不等于 应用与整数比较 not equal
-lt 小于 应用与整数比较 letter
-gt 大于 应用与整数比较 greatter
-le 小于或等于 应用与整数比较
-ge 大于或等于 应用与整数比较
案例:
[hadoop@hadoop111 ~]$ test 2 -gt 1 ;echo $ ?
0
[hadoop@hadoop111 ~]$ test 2 -eq 1;echo $?
1
测试语句另一种常用的使用方法
比如可以省略test写成:[ init1 –lt init2 ],也可以使用最新扩展测试命令语法[[init1 –lt init2]]。
注意:在使用"["简写test时,左中括号后面的空格和右括号前面的空格是必需的,如果没有空格,Shell不可能辨别表达式何时开始何时结束。
数值判断案例:
[hadoop@hadoop111 ~]$ [ 3 -eq 5 ];echo $ ?
1
[hadoop@hadoop111 ~]$ [ 3 < 5 ];echo $ ?
0
[hadoop@hadoop111 ~]$ [[ 3 -eq 5 ]];echo $?
1
文件判断案例:
[hadoop@hadoop111 ~]$ [ -d /etc/hosts ];echo $ ?
1
[hadoop@hadoop111 ~]$ [ -f /etc/hosts ];echo $ ?
0
[hadoop@hadoop111 ~]$ [ -x /etc/hosts ];echo $?
1
提示:“<”和“>””=”分别为小于 大于 等于,并且在[ ]中“<”“>”都要使用转义字符 \ ,在[[ ]]中不需要
3、字符串测试
参数:说明 示例
= 等于则为真 [ “$a” = “$b” ]
!= 不相等则为真 [ “$a” != “$b” ]
-z 字符串:字符串的长度为零则为真 [ -z “$a” ]
-n 字符串:字符串的长度不为空则为真 [ -n “$a” ]
案例:
[hadoop@hadoop111 ~]$ test abc = abc ;echo $ ?
0
[hadoop@hadoop111 ~]$ test abc = ab ;echo $ ?
1
[hadoop@hadoop111 ~]$ test “abc” = “ab c” ;echo $ ?
1
[hadoop@hadoop111 ~]$ lee=""
[hadoop@hadoop111 ~]$ test -z ${lee};echo $ ?
0
[hadoop@hadoop111 ~]$ name=“jasperlee”
[hadoop@hadoop111 ~]$ test -z ${name}; echo $ ?
1
[hadoop@hadoop111 ~]$ test -n ${name};echo $?
0
4、逻辑表达式
|| 逻辑或 ;两个条件有一个成立 ,结果为真
&& 逻辑与;仅当两个条件都成立时,结果为真
注:脚本中的逻辑或和逻辑与不能用and和or来表示
案例
[hadoop@hadoop111 ~]$ [ -f /etc/passwd ]&&[ -w /etc/passwd ];echo $ ?
0
[hadoop@hadoop111 ~]$ [ -f /etc/passwd ]&&[ -x /etc/passwd ];echo $ ?
1
[hadoop@hadoop111 ~]$ [ 2 -gt 1 ] || [ 3 -lt 5 ];echo ? 0 [ h a d o o p @ h a d o o p 111 ] ? 0 [hadoop@hadoop111 ~] ?0[hadoop@hadoop111 ] [ 2 -gt 1 ]||[ 8 -lt 5 ];echo $?
0
数值与字符的区别:
数值比较 字符比较
-eq == 等于
-ne != 不等于
-gt > 大于
-ge >= 大于等于
-lt < 小于
-le <= 小于等于
流程控制–if语句
单分支if语句
语法格式如下:
if 条件
then
语句
fi
if 条件 ; then
语句
fi
扩展 ;分号,表示两个命令写在一行,互不影响。
案例:
#!/bin/bash
if [ "$USER" != "root" ];then
echo "当前用户不是ROOT用户"
fi
双分支if语句
语法格式如下:
if 条件1 ; then
命令1
else
命令2
fi
案例:
#!/bin/bash
#检测一个IP通信是否正常
ping -c2 $1 > /dev/null
if [ $? -eq 0 ];then
echo "Host is up"
else
echo "Host is down"
fi
#!/bin/bash
#判断一个服务是不是启动状态
service status $1 &> /dev/null
if [ $? -eq 0 ];then
echo "service $1 is running"
else
echo "service $1 is stopping"
fi
多分支if语句
更复杂的if语句,语法结构如下
if 条件1 ; then
命令1
elif 条件2 ; then
命令2:
elif 条件3 ; then
命令3
……………………
else
命令n
fi
案例:
#!/bin/bash
m=man
w=woman
echo "Please input you's sex [man/woman] "
read -p "请输入你的性别:" ss
if [ "$ss" == "man" ]||[ "$ss" == "MAN" ];then
echo "你是男人"
elif [ "$ss" == "woman" ]||[ "$ss" == "WOMAN" ];then
echo "你是女人"
else
echo "恭喜你!从泰国旅游回来"
fi
扩展—判断
写法一:
if [ 条件判断一 ] && (||) [ 条件判断二 ]; then
命令一
elif [ 条件判断三 ] && (||) [ 条件判断四 ]; then
命令二
else
执行其它
fi
案例:
#!/bin/bash
read -p "input a file : " filename
if [ -f $filename ]&&[ -w $filename ];then
echo "Hello world " > $filename
echo "write success"
else
echo "$filename not is file"
fi
写法二:
if [[条件判断一 && (||) 条件判断二 ]]; then
elif [[ 条件判断三 && (||) 条件判断四 ]]; then
else
执行其它
fi
案例:
#!/bin/bash
read -p "请输入要添加的文件名称:" file_name
if [[ -e $file_name && -r $file_name && -w $file_name ]];then
echo "Hello world,awk" > $file_name
echo success
else
echo "$file_name not is a file"
fi
写法三:
if [条件判断一 -a (-o) 条件判断二 ]; then
elif [条件判断三 -a (-o) 条件判断四 ]; then
else
执行其它
fi
案例:
[hadoop@hadoop111 ~]$ [[ 2 < 3 -a 4 > 5 ]] && echo true || echo false
-bash: syntax error in conditional expression
-bash: syntax error near `-a'
[hadoop@hadoop111 ~]$ [[ 2 < 3 && 4 > 5 ]] && echo true || echo false
false
[hadoop@hadoop111 ~]$ [ 1 -lt 2 -o b > a ] && echo ok
ok
[hadoop@hadoop111 ~]$ [ 1 -lt 2 -a b > a ] && echo ture|| echo false
ture
[hadoop@hadoop111 ~]$ [[ 1 < 5 || 4 > 5 ]] && echo ture|| echo false
ture
总结
1、所有的字符与逻辑运算符直接用“空格”分开,不能连到一起。
2、在[… ]表达式中,常见的> 、<需要加转义符\,大小比较。
3、进行逻辑运算符&& 、||比较时;如果用的[ ]符号,则用在外面,如[… ] && [… ] || [ …]如果在[…]里面进行逻辑与或,则用-a、-o进行表示,如[ x = y –a x < z –o x > m ]。
4、[[… ]] 运算符只是[… ]运算符的扩充;能够支持< 、>符号运算不需要转义符;它还是以字符串比较大小。里面支持逻辑运算符 || 、 && 不再使用-a 、-o。
5、[[…]] 用 && 而不是 –a 表示逻辑“与”;用 || 而不是 -o表示逻辑“或”。
6、[[… ]]可以进行算术扩展,而[ … ]不可以。
7、[[…]]能用正则,而[…]不行
案例:
[hadoop@hadoop111 ~]$ [ "a.txt" == [a-z].txt ]&& echo ok || echo error
-bash: [: too many arguments
error
[hadoop@hadoop111 ~]$ [[ "a.txt" == [a-z].txt ]]&& echo ok || echo error
ok
[hadoop@hadoop111 ~]$ [ "a.txt" == *.txt ]&& echo ok || echo error
-bash: [: too many arguments
error
[hadoop@hadoop111 ~]$ [[ a.txt == *.txt ]]&& echo ok || echo error
ok