条件测试语句和if流程控制语句
1、read命令讲解
简介
我们编写脚本的时候通常需要使用到键盘输入;而计算机通过键盘输入而读取数据;
从键盘中读取变量的值,通常在shell脚本中与用户进行交互的场合,而read命令是可以一次性读取多个变量的值;
而输入的值都是需要用空格隔开;如果没有指定变量名,读取的数据将自动复制给到特定的变量;
[root@node0 ~]
liangjiawei sunjia
[root@node0 ~]
liangjiawei sunjia
read命令
作用:通过键盘输入读取数值变量
语法:read + 选项
选项:
- read + 变量–>等待输入的信息作为变量的值
- read + 变量+变量:可以从第一个复制给变量,其余的都给到后面的变量
- -s:隐藏输入的信息,可以吟唱输入的密码
- -t:指定输入的时间,如果在规定的时间内没有任何输入会直接跳出read
- -n:指定接收的输入字符的长度,
- -r:支持输入的内容可以是特殊符号;
- -p:指定输入的提示信息
[root@node0 ~]
liangjiawei wujinyuan sunjia
[root@node0 ~]
liangjiawei
[root@node0 ~]
wujinyuan sunjia
[root@node0 ~]
[root@node0 ~]
123456
[root@node0 ~]
[root@node0 ~]
lia[root@node0 ~]
[root@node0 ~]
、;‘’///\\\
[root@node0 ~]
、;‘’///\\\
[root@node0 ~]
please input you message: liangjaiwei
[root@node0 ~]
liangjaiwei
[root@node0 ~]
read -p "输入你的名字:" NAME
read -p "输入你的年龄:" AGE
read -p "输入你的性别:" SEX
cat <<EOF
****************
你的基本信息如下:
姓名:$NAME
年龄:$AGE
性别:$SEX
****************
EOF
[root@node0 ~]
输入你的名字:LIANGJIAWEI
输入你的年龄:18
输入你的性别:MAN
****************
你的基本信息如下:
姓名:LIANGJIAWEI
年龄:18
性别:MAN
****************
2、if流程控制语句
单分支语法格式
if+条件
then
命令
fi
注意:$0可以用于判断命令执行的是否有问题,echo 出来的结果为0那么代表命令执行成功,如果非0,那么代表命令执行失败;
[root@node0 ~]
if ls /mnt/ >/dev/zero &>1;then
echo "it is ok"
fi
[root@node0 ~]
it is ok
双分支语法格式
if +条件;then
命令
else
命令
fi
[root@node0 ~]
if grep root /etc/passwd; then
echo "it is root"
else
echo "it not root"
fi
[root@node0 ~]
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
it is root
多分支语法格式
if + 条件测试操作1 ;then
命令
elif 测试条件;then
命令
elif 测试条件;then
命令............
else
命令..........
fi
[root@node0 ~]
read -p "input a user name :" NAME
if grep $NAME /etc/passwd ;then
echo "this user is $NAME is exists on the system"
elif ls -d /home/$NAME ;then
echo "the user $NAME not exists on the system"
echo "the user $NMAE has home directory"
else
echo "the user $NAME not exists on the system"
echo "the user $NMAE not has home directory"
fi
[root@node0 ~]
input a user name :liangjiawei
liangjiawei:x:1000:1000:liangjiawei:/home/liangjiawei:/bin/bash
this user is liangjiawei is exists on the system
3、test测试命令
shell中的test命令是用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试比较
语法:test+测试条件
如果测试的条件是对的、那么结果就为真,如果测试的条件是错的,那么结果就为假;使用echo $0输出的结果是0就是真的,非0就是加的;
数值的比较
参数 | 说明 | 示例 |
---|
-eq | 等于则为真 | [ “
a
”
?
e
q
“
a” -eq “
a”?eq“b” ] | -ne | 不等于则为真 | [ “
a
”
?
n
e
“
a” -ne “
a”?ne“b” ] | -gt | 大于则为真 | [ “
a
”
?
g
t
“
a” -gt “
a”?gt“b” ] | -ge | 大于等于则为真 | [ “
a
”
?
g
e
“
a” -ge “
a”?ge“b” ] | -lt | 小于则为真 | [ “
a
”
?
l
t
“
a” -lt “
a”?lt“b” ] | -le | 小于等于则为真 | [ “
a
”
?
l
e
“
a” -le “
a”?le“b” ] |
这里也能够发现其实test命令其实和中括号的意思是一样的,但是中括号就得使用两边都是空格
记住:整数的比较是不能带有小数点的;
例子如下
[root@node0 ~]
if test 2 -eq 1 ;then
echo "it is right"
else
echo "it is error"
fi
[root@node0 ~]
it is error
[root@node0 ~]
read -p "Please input two number: " number1 number2
if [ $number1 -gt $number2 ];then
echo "$number1 > $number2"
elif [ $number1 -lt $number2 ];then
echo "$number1 < $number2"
else
echo "$number1 = $number2"
fi
[root@node0 ~]
+ read -p 'Please input two number: ' number1 number2
Please input two number: 1 2
+ '[' 1 -gt 2 ']'
+ '[' 1 -lt 2 ']'
+ echo '1 < 2'
1 < 2
字符串的比较
参数 | 说明 |
---|
== | 等于则为真 | != | 不想 | -z 字符串 | 字符串的长度为0则为真 | -n 字符串 | 字符串的长度不为空则为真 | str1 > str2 | 大于为真 | str1 < str2 | 小于为真 |
[root@node0 ~]
read -p "input your name: " name
if [ $name == "root" ];then
echo "you are super administrator;"
else
echo "you are a general user"
fi
[root@node0 ~]
input your name: root
you are super administrator;
在做字符串大小比较的时候,注意字符串的顺序;
- 大于号和小于号必须转义,要不然SHELL会把它当成重定向符号
- 大于和小于它们的顺序和sort排序是不一样的
- 在test比较测试中,它使用的是ASCII顺序,大写字母是小于小写字母的;sort刚好相反
扩展: ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。
[root@node0 ~]
VAR1=test
VAR2=Test
if [ $VAR1 \> $VAR2 ];then
echo "$VAR1 > $VAR2"
else
echo "$VAR1 < $VAR2"
fi
[root@node0 ~]
test > Test
文件比较
参数 | .说明 | 示例 |
---|
-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 ] | file1 -nt fle2 | 检查file1是否比file2新 | [ file1 -nt file2 ] | file1 -ot file2 | 检查file1是否比file2旧 | [ file1 -ot file2 ] |
示例:
退出码exit ,取值范围:0-255
[root@node0 ~]
if [ -e /etc/passwd ];then
echo ok
else
echo error
fi
[root@node0 ~]
ok
[root@node0 ~]
ok
[root@node0 ~]
if [ $USER != "root" ];then
echo "你必须使用root 用户才能执行脚本"
exit 10
fi
if [ ! -f /var/log/messages ];then
echo "文件不存在"
exit 12
fi
tail -100 /var/log/messages >> /var/log/mesg.tmp
> /var/log/messages
mv /var/log/mesg.tmp /var/log/messages
echo "Logs clean up "
[root@node0 ~]
[root@node0 ~]
Logs clean up
4、流程控制过程中复杂条件和通配符
判断第一种
两个条件都为真或者有一个为真就执行
if [ 条件判断一 ] &&(||) [ 条件判断二 ];then
命令一
elif [ 条件判断三 ] &&(||) [ 条件判断四 ];then
命令二
else
执行其他的
fi
判断第二种
if [ 条件判断一 -a(-o) 条件判断二 -a(-o) 条件判断三 ];then
elif [条件判断三 -a (-o) 条件判断四 ]; then
else
执行其它
fi
判断第三种
if [[条件判断一 && (||) 条件判断二 ]]; then
elif [[ 条件判断三 && (||) 条件判断四 ]]; then
else
执行其它
fi
参考一下umask的配置
[root@node0 ~]
......
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
双括号和单括号的区别
[ [ …… ] ] 和 [ …… ]
双括号运算符是单括号运算符的扩充;
[ … ]能够支持通配符符号且不需要转义符
[root@node0 ~]
hello root
注: $USER == r*对比时, r* 表示以r开头的任意长度字符串,这样就包括root
[root@node0 ~]
root not
[root@node0 ~]
hello root
[[ …… ]]和[…….]的区别汇总
1、所有的字符与逻辑运算符直接用“空格”分开,不能连到一起。
2、在[ … ]表达式中,常见的> 、<需要加转义符\,大小比较
3、进行逻辑运算符&& 、||比较时;如果用的[ ]符号,则用在外面,如[… ] && [… ] || [ …]如果在[…]里面进行逻辑与或的比较,则用-a、-o进行表示,如[ x = y –a x < z –o x > m ]
4、[[… ]] 运算符只是[… ]运算符的扩充;能够支持< 、>符号运算不需要转义符;它还是以字符串比较大小。里面支持逻辑运算符 || 、 && , 不再使用-a 、-o
5、[[…]] 用 && 而不是 -a 表示逻辑“与”;用 || 而不是 -o表示逻辑“或”
6、[[… ]]可以进行算术扩展,而[ … ]不可以
7、[[…]]能用正则,而[…]不行
8、双括号(( ))用于数学表达式
9、双方括号号[[ ]]用于高级字符串处理,比如“模糊匹配”
shell中的通配符
字符 | 含义 | 实例 |
---|
***** | 匹配 0 或多个字符 | a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。 | ? | 匹配任意一个字符 | a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。 | [list] | 匹配 list 中的任意单一字符 | a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。 | [!list] | 匹配 除list 中的任意单一字符 | a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。 | [c1-c2] | 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] | a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b… a9b。 | {string1,string2,…} | 匹配 sring1 或 string2 (或更多)其一字符串 | a{abc,xyz,123}b a与b之间只能是abc或xyz或123这三个字符串之一。 |
[root@node0 ~]
[root@node0 ~]
/etc/sos.conf /etc/yum.conf
|