0 绪:
bash中常用的测试比较有三种:
字符测试
整数测试
文件测试
下文讲下这三种测试,以及if分支
1 写法:
[ expression ]
[[ expression ]]
test expression
只有在
1 算术表达式两两使用 -eq -gt等的时候
2 文件测试
才会使用到 []
比如 if grep "\<bash\>" /etc/passwd ; then
echo "111"
fi
此时if会自动获取右侧grep命令执行后的状态结果,是0则if会认为是满足条件的,会输出111
此时不会使用到[]
2 整数测试/比较: 数值比较一定加[]
-eq: 测试两个整数是否相等;比如 $A -eq $B
-ne: 测试两个整数是否不等;不等,为真;相等,为假;
-gt: 测试一个数是否大于另一个数;大于,为真;否则,为假;
-lt: 测试一个数是否小于另一个数;小于,为真;否则,为假;
-ge: 大于或等于
-le:小于或等于
eg:
[root@hadoop3 ~]# a=3
[root@hadoop3 ~]# b=4
[root@hadoop3 ~]# [ $a -eq $b ]
[root@hadoop3 ~]# echo $?
1
3 命令的间逻辑关系:
逻辑与: &&
第一个条件为假时,第二条件不用再判断,最终结果已经有;
第一个条件为真时,第二条件必须得判断;
逻辑或: ||
逻辑非: !
eg:
[root@hadoop3 ~]# id root &> /dev/null && echo "hello root"
hello root
! id user6 && useradd user6 ----> 如果用户user6不存在,就添加用户user6
id user6 || useradd user6 ----> 如果用户存在,则不添加, 如果用户不存在,则添加user6
4 条件判断,控制结构:
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
if脚本练习:
练习,写一个脚本,完成以下要求:
给定一个用户:
1、如果其UID为0,就显示此为管理员;
2、否则,就显示其为普通用户;
NAME=user16
if [ `id -u $NAME` -eq 0 ]; then
echo "Admin"
else
echo "common user."
fi
给定一个文件,比如/etc/inittab
判断这个文件中是否有空白行;
如果有,则显示其空白行数;否则,显示没有空白行。
#!/bin/bash
A=`grep '^$' /etc/inittab | wc -l`
if [ $A -gt 0 ]; then
echo "$A"
else
echo "no blank"
fi
给定一个用户,判断其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
判断当前系统上是否有用户的默认shell为bash;
如果有,就显示有多少个这类用户;否则,就显示没有这类用户;
total = `grep "\<bash$" /etc/passwd &> /dev/null | wc -l`
if [ $total -eq 0 ]; then
echo "no such bash user"
else
echo "the bash users num is $total"
5 shell中的整数算术运算:
1、let 算术运算表达式(注意 =右侧表达式不能有空格)
let C=$A+$B
2、$[算术运算表达式] 这个用的多一点
C=$[$A+$B]
3、$((算术运算表达式))
C=$(($A+$B))
4、expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
C=`expr $A + $B`
eg:
[root@chinadaas109 ~]# a=3
[root@chinadaas109 ~]# b=4
[root@chinadaas109 ~]# let c=$a + $b
-bash: let: +: syntax error: operand expected (error token is "+")
[root@chinadaas109 ~]# let c=$a+$b
[root@chinadaas109 ~]# echo $c
7
eg:
给脚本传递两个参数(整数);
显示此两者之和,之乘积;
#!/bin/bash
#
if [ $# -lt 2 ]; then
echo "Usage: cacl.sh ARG1 ARG2"
exit 8
fi
echo "The sum is: $[$1+$2]."
echo "The prod is: $[$1*$2]."
6 文件测试:
-e FILE:测试文件是否存在(e = exists)
-f FILE: 测试文件是否为普通文件 (f = file)
-d FILE: 测试指定路径是否为目录 (d = direcoty)
-r FILE: 测试当前用户对指定文件是否有读取权限; ( r = read)
-w FILE: 测试当前用户对指定文件是否有写取权限; ( w = write)
-x FILE: 测试当前用户对指定文件是否有执行取权限; ( x = execute)
eg:
使用方式:
[ -e /etc/inittab ]
[ -x /etc/rc.d/rc.sysinit ]
eg: 如果是一个文件 显示文件名 否则显示不存在
[root@chinadaas109 zhoumingtest]# cat fortest.sh
#!/bin/sh
#
filename=/etc/inittab
if [ -e $filename ]; then
echo "filename is: $filename"
else
echo "no $filename is here!"
fi
7 展示单步执行的结果
[root@chinadaas109 zhoumingtest]# cat fortest.sh
#!/bin/sh
#
filename=/etc/inittab
if [ -e $filename ]; then
echo "filename is: $filename"
else
echo "no $filename is here!"
fi
[root@chinadaas109 zhoumingtest]# bash -x fortest.sh
+ filename=/etc/inittab 第一步执行赋值操作
+ '[' -e /etc/inittab ']' 第二部执行if判断操作
+ echo 'filename is: /etc/inittab' 第三部执行echo打印操作
filename is: /etc/inittab
8 脚本退出码:
exit: 退出脚本 0表示正常退出 非0表示异常退出
exit #
如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码;
9 字符测试:
==:测试是否相等,相等为真,不等为假,
(注意在 变量1 = 变量2 或者 变量1 = string时,shell会自动识别并将=理解成== 而不是赋值操作)
!=: 测试是否不等,不等为真,等为假
>
<
-n string: 测试指定字符串是否为空,空则真,不空则假 n可以理解为null
-z string: 测试指定字符串是否不空,不空为真,空则为假
使用的时候,==左右两侧的变量需要和==之间有空格,写法如下
[root@chinadaas109 ~]# a=hello
[root@chinadaas109 ~]# b=hi
[root@chinadaas109 ~]# [ $a == $b ]
[root@chinadaas109 ~]# echo $?
1
字符比较练习:
传递一个参数(单字符就行)给脚本,如参数为q、Q、quit或Quit,就退出脚本;否则,就显示用户的参数;
#!/bin/bash
#
if [ $1 = 'q' ];then 这里的=会被shell理解为 ==
echo "Quiting..."
exit 1
elif [ $1 = 'Q' ];then
echo "Quiting..."
exit 2
elif [ $1 = 'quit' ];then
echo "Quiting..."
exit 3
elif [ $1 = 'Quit' ];then
echo "Quiting..."
exit 4
else
echo $1
fi