bash中如果实现条件判断?
条件测试类型
- 整数测试
- 字符测试
- 文件测试
条件测试的表达式
有三种
[ expression ] --方括号与表达式之间一定要有一个空格
[[ expression ]]
test expression
整数测试
-eq: 测试两个整数是否相等 例:$A -eq $B -ne: 测试两个整数是否不等 不等为真,相等为假 -gt: 测试一个数是否大于另一个数;大于,为真;否则,为假; -lt: 测试一个数是否小于另一个数;小于,为真;否则,为假; -ge: 大于或等于 -le: 小于或等于
命令的间逻辑关系
逻辑与: &&
第一个条件为假时,第二条件不用再判断;
第一个条件为真时,第二条件必须得判断;
逻辑或: ||
第一个条件为假时,第二条件必须得判断;
第一个条件为真时,第二条件不用再判断;
例:比较两个数大小
[root@iZ28g26851kZ ~]# A=12
[root@iZ28g26851kZ ~]# B=15
[root@iZ28g26851kZ ~]# [ $A -gt $B ] && echo "A比较大" || echo "B比较大"
B比较大
[root@iZ28g26851kZ ~]# A=20
[root@iZ28g26851kZ ~]# [ $A -gt $B ] && echo "A比较大" || echo "B比较大"
A比较大
[root@iZ28g26851kZ ~]#
如果A大于B则[ $A -gt $B ]
为真,需要执行(判断)echo "A比较大"
最终[ $A -gt $B ] && echo "A比较大"
为真,所以不用再执行echo "B比较大"
if语句
——–单分支
if 判断条件 ;then
statement1
...
fi
——–双分支
if 判断条件 ;then
statement1
...
else
statement2
...
fi
——–多分支
if 判断条件 ;then
statement1
...
elif 判断条件2 ; then
statement2
...
elif 判断条件3 ; then
statement3
...
else
statement4
...
fi
例:判断用户user1是否存在,存在显示用户已存在,不存在则创建用户,密码和用户名相同
adduser.sh
#!/bin/bash
NAME=user1
if id $NAME &> /dev/null; then
echo "用户已存在"
else
echo "当前一共有用户`wc -l /etc/passwd | cut -d" " -f1`人"
echo "用户不存在,正在创建用户"
useradd $NAME
echo $NAME | passwd --stdin $NAME &> /dev/null
echo "当前一共有用户`wc -l /etc/passwd | cut -d" " -f1`人"
fi
执行结果
[root@iZ28g26851kZ ~]# ./adduser.sh
当前一共有用户30人
用户不存在,正在创建用户
当前一共有用户31人
[root@iZ28g26851kZ ~]# ./adduser.sh
用户已存在
[root@iZ28g26851kZ ~]#
算数运算
之前说了,shell中默认所有变量都是字符串,所以要进行算数运算就必须用命令处理
let
let 算数运算表达式
例:
[root@iZ28g26851kZ ~]# b=23
[root@iZ28g26851kZ ~]# a=12
[root@iZ28g26851kZ ~]# let c=$a+$b
[root@iZ28g26851kZ ~]# echo $c
35
[root@iZ28g26851kZ ~]#
$[算数运算表达式]
例:
[root@iZ28g26851kZ ~]# c=$[$a+$b*2]
[root@iZ28g26851kZ ~]# echo $c
58
[root@iZ28g26851kZ ~]#
$((算数运算表达式))
例:
[root@iZ28g26851kZ ~]# c=$(($a*2+$b*2))
[root@iZ28g26851kZ ~]# echo $c
70
[root@iZ28g26851kZ ~]#
expr
expr 一般用于整数运算,会自动取整,小数点后面的直接去掉
且 运算数与运算符号之间一个要有一个空格,如果没有空格就会像下面这样
[root@iZ28g26851kZ ~]# expr 10/3
10/3
[root@iZ28g26851kZ ~]#
原样输出了,,所以必须要加上空格
例:
[root@iZ28g26851kZ ~]# expr 10 / 3
3
[root@iZ28g26851kZ ~]# expr 10 + 3
13
[root@iZ28g26851kZ ~]# expr 10 - 3
7
[root@iZ28g26851kZ ~]# expr 10 * 3
expr: syntax error
可以看出,加,减,除,都没有问题,唯独乘法运算时居然说语法错误,
好吧,这里expr应该是吧 * 当匹配字符用了,所以需要转义一下
[root@iZ28g26851kZ ~]# expr 10 \* 3
30
ok,这样就搞定了
文件测试
-e FILE: 测试文件是否存在
-f FILE: 测试文件是否为普通文件
-d FILE: 测试指定路径是否为目录
-r FILE: 测试当前用户对指定文件是否有读取权限
-w FILE: 测试当前用户对指定文件是否有写入权限
-x FILE: 测试当前用户对指定文件是否有执行权限
例:判断一个文件是否存在,存在则显示其行数
#!/bin/bash
FILENAME=/etc/passwd
if [ -e $FILENAME ]; then
echo "文件存在"
echo "文件一共有` wc -l $FILENAME | cut -d" " -f1`行"
else
echo "文件不存在"
fi
如何中途退出脚本
在需要退出的地方使用exit #即可,#号为一个退出状态(0-255的一个数值)。
0:表示脚本执行成功
1-255:表示执行失败
也可以什么都不返回,脚本会默认返回上一条结果的执行状态
例:
exittest.sh
#!/bin/bash
echo "第一行"
echo "第二行"
exit 18
echo "第三行"
执行结果
[root@iZ28g26851kZ ~]# ./exittest.sh
第一行
第二行
[root@iZ28g26851kZ ~]# echo $?
18
[root@iZ28g26851kZ ~]#
显示执行脚本的过程
有些时候,当脚本太长,出错之后无法快速找到原因,可以使用 bash -x xxx.sh
来执行脚本,该命令可将脚本执行的过程显示出来
例:判断文件是否存在
filetest.sh
#!/bin/bash
#
FILENAME=/etc/passwd
if [ -e $FILENAME ];then
echo "文件存在"
else
echo "文件不存在"
fi
执行
[root@iZ28g26851kZ ~]# bash -x filetest.sh
+ FILENAME=/etc/passwd
+ '[' -e /etc/passwd ']'
+ echo $'\346\226\207\344\273\266\345\255\230\345\234\250'
文件存在
[root@iZ28g26851kZ ~]#
这样就可以很方便的检查脚本了
字符测试
相等比较
[ string == string ]
记住,[空格string空格==空格string空格]
少一个都不行哦~~
例:
[root@iZ28g26851kZ ~]# [ "asd" == "asdd" ]
[root@iZ28g26851kZ ~]# echo $?
1
[root@iZ28g26851kZ ~]# [ "asd" == "asd" ]
[root@iZ28g26851kZ ~]# echo $?
0
[root@iZ28g26851kZ ~]#
不等比较
[ string != string ]
例:
[root@iZ28g26851kZ ~]# [ "asd" != "asd" ]
[root@iZ28g26851kZ ~]# echo $?
1
[root@iZ28g26851kZ ~]# [ "asd" != "asdd" ]
[root@iZ28g26851kZ ~]# echo $?
0
[root@iZ28g26851kZ ~]#