一、条件判断表达式
条件测试类型:
- 整数测试
- 字符测试
- 文件测试
条件测试的表达式
[ expression ](注意expression头和尾部各有一个空格)
[[ expression ]]
test expression
算术运算有三种方法:
- let 算术运算表达式
- $[算术运算表达式]
- $((算术运算表达式))
- expr 算术运算表达式
[root@hao ~]# A=3 [root@hao ~]# B=4 [root@hao ~]# let C=$A+$B [root@hao ~]# echo $C 7 [root@hao ~]# D=$[$A+$B] [root@hao ~]# echo $D 7 [root@hao ~]# E=$(($A+$B)) [root@hao ~]# echo $E 7 [root@hao ~]# F=`expr $A + $B` [root@hao ~]# echo $F 7
1、整数测试:
-eq:测试两个整数是否相等 $A -eq $ eB。
[root@hao ~]# A=3 [root@hao ~]# B=6 [root@hao ~]# [ $A -eq $B ] [root@hao ~]# echo $? 1
-ne:测试两个整数是否不等
-gt:测试一个数是否大于另一个数
-lt:小于
-ge:大于等于
-le:小于或等于
语句间的逻辑关系(短路操作)
逻辑与、逻辑或
下面代码实现逻辑与,如果用户存在,则第一个语句为TRUE,则执行第二个语句。否则,若用户不存在,即第一个语句为false,则该逻辑与结果必为false,因此第二个语句就不会执行
[root@hao ~]# id user1 &> /dev/null && echo "hello,test true" [root@hao ~]# id hao &> /dev/null && echo "hello,test true" hello,test true
(1)如果用户不存在,则添加用户(用逻辑与、逻辑或两种方法实现)
[root@hao ~]# id user2 id: user2: No such user [root@hao ~]# id user2 &> /dev/null || useradd user2 [root@hao ~]# id user2 uid=5002(user2) gid=5002(user2) groups=5002(user2) [root@hao ~]# id user3 id: user3: No such user [root@hao ~]# ! id user3 &> /dev/null && useradd user3 [root@hao ~]# id user3 uid=5003(user3) gid=5003(user3) groups=5003(user3)
(2)如果一个文件的行数大于100,则显示该文件为大文件,否则显示为小文件
#!/bin/bash LINES=$(wc -l /etc/inittab) echo $LINES FINLINES=`echo $LINES |cut -d' ' -f1` echo $FINLINES [ $FINLINES -gt 100 ]&& echo "etc/inittab is a big file" || echo "etc/inittab is a small file"
执行结果为:
26 /etc/inittab 26 etc/inittab is a small file
(3)如果用户存在,则显示该用户,如果用户不存在,则添加此用户
[root@hao ~]# id user1 && echo "user1 exits." || useradd user1 uid=5001(user1) gid=5001(user1) groups=5001(user1) user1 exits.
(4)如果用户不存在,则添加用户并添加密码,如果存在,则显示用户已存在
[root@hao ~]# ! id user1 && useradd user1 && echo "user1" | passwd --stdin user1 || echo "user1 exits" uid=5001(user1) gid=5001(user1) groups=5001(user1) user1 exits
(5)给定一个用户,如果其UID为0,则显示为管理员,否则显示为普通用户
[root@hao ~]# nano third.sh [root@hao ~]# cat third.sh #!/bin/bash NAME=user1 USERID=`id -u $NAME` [ $USERID -eq 0 ] && echo "Admin" || echo "Common user". [root@hao ~]# chmod +x third.sh [root@hao ~]# ./third.sh Common user.
2、文件测试
-e file :测试文件是否存在
-f file :测试文件是否为普通文件
-d file:测试指定路径是否为目录
-r file:测试指定文件对当前用户是否可读
-w file:测试指定文件对当前用户是否可写
-x file:测试指定文件对当前用户是否可执行
(1)判断一个文件是否存在
#!bin /bash FILE=/etc/inittab if [ ! -e $FILE ] then echo "no file" exit 8 fi
(2)给定一个文件,如果不存在,则退出脚本,如果存在且该文件为普通文件或者目录就显示之,否则,
#!/bin/bash FILE=/etc/rc.d/rc.sysinit if [ ! -e $FILE ] then echo "no file" exit 6 fi if [ -f $FILE ] then echo "common file" elif [ -d $FILE ] then echo "directory" else echo "unknown" fi
二、条件判断控制结构
1、单分支if语句:
if 判断条件
then
statement1
statement2
...
fi
2、双分支的if语句
if 判断语句
then
statement1
statement2
else
statement3
statement4
fi
3、多分支的if语句
if 判断条件1
then
statement1
...
elif 判断条件2
then
statement2
...
elif 判断条件3
then
statement3
...
else
statement4
...
fi
4、测试
(1)如果用户存在,输出用户存在,否则创建用户名和密码为用户名的密码。
[root@hao ~]# nano fourth.sh [root@hao ~]# cat fourth.sh #!/bin/bash NAME=user4 if id $NAME &> /dev/null then echo "$NAME exists" else useradd $NAME echo $NAME | passwd --stdin $NAME &> /dev/null echo "add user successful" fi [root@hao ~]# chmod +x fourth.sh [root@hao ~]# ./fourth.sh add user successful [root@hao ~]# ./fourth.sh user4 exists
(2)判断一个用户是否是管理员
[root@hao ~]# nano fifth.sh [root@hao ~]# cat fifth.sh #!/bin/bash NAME=user1 if [ `id -u $NAME ` -eq 0 ] then echo "Admin" else echo "Common" fi [root@hao ~]# chmod +x fifth.sh [root@hao ~]# ./fifth.sh Common
(3)判断当前系统上是否有用户的默认shell为bash,如果有,就显示有多少个这类用户,否则,就显示没有这类用户
[root@hao ~]# nano sixth.sh [root@hao ~]# cat sixth.sh #!/bin/bash grep "<bash$" /etc/passwd &> /dev/null RETVAL=$? if [ $RETVAL -eq 0 ] then USERS=`grep "<bash$" /etc/passwd | wc -l` echo "$USERS users has shell of bash" else echo "no such users" fi [root@hao ~]# chmod +x sixth.sh [root@hao ~]# ./sixth.sh 12 users has shell of bash
(4)上题基础上,如果存在上述用户,显示其中一个的用户名,否则显示没有此类用户
[root@hao ~]# nano seventh.sh [root@hao ~]# cat seventh.sh #!/bin/bash grep "<bash$" /etc/passwd &> /dev/null RETVAL=$? if [ $RETVAL -eq 0 ] then AUSER=`grep "<bash$" /etc/passwd | head -1 | cut -d: -f1` USERS=`grep "<bash$" /etc/passwd | wc -l` echo "One of the $USERS is $AUSER" else echo "no such users" fi [root@hao ~]# chmod +x seventh.sh [root@hao ~]# ./seventh.sh One of the 12 is root
(5)给定一个用户,判断其UID与GID是否一样,如果一样,就显示此用户为“good guy”;否则,就显示此用户为“bad guy”
#!/bin/bash USERNAME=user1 USERID=`id -u $USERNAME` GROUPID=`id -g $USERNAME ` if [ $USERID-eq $GROUPID] then echo "good guy" else echo "bad guy" fi
三、测试脚本
测试脚本是否有语法错误
bash -n file.sh
单步执行脚本
bash -x file.sh
四、定义退出状态码
exit:退出脚本
exit #
如果脚本没有明确定义退出状态吗,那么最后执行的一条命令的退出码即为脚本的退出码