bash脚本之条件测试
条件测试的四种方式:
testEXPRESSION
[EXPRESSION ]
[[ EXPRESSION ]]:双中括号与单中括号大部分时候是通用的,但有时候会与一些与或运算符冲突,使用中需注意
COMMAND:此处测试的是命令执行的状态返回值,即命令执行成功与否,若成功则返回值为0否则为1-255之间的任意数字
测试表达式:
整数测试:A, B
A -gt B: 大于
A-ge B: 大于等于
A-eq B: 等于
A-lt B: 小于
A-le B: 小于等于
A-ne B: 不等于
字符串测试:A, B
A> B
A< B
A>= B
A<= B
A== B或A = B:等值比较
A!= B: 不等于
-zA: 判断A是否为空;空则为真,不空则假;
-nA:判断A是否不空;不空则为值,空则为假;
条件测试之if语句
单分支if语句
if条件;then
命令1
命令2
…
fi
if语句单分支实例
100以内所有偶数之和,遍历所有的1-100整数
#!/bin/bash declare -i sum=0 for i in{1..100};do if [ $[$i%2] -eq 0 ] ;then sum=$[$sum+$i] fi done echo"$sum"
fi语句也可以嵌套
if 条件 ;then
if 条件;then
命令1
…
fi
fi
条件取反
!条件:不满足条件时为真满足时为假
if嵌套语句实例
(1) 添加用户user1-user10;
(2) 用户不存在时才添加;
(3) 统计真正添加的用户数;
#!/bin/bash declare -i users=0 for i in {1..10};do if ! id user$i; then useradd user$i users=$[$users+1] fi done echo "$users."
双分支if语句
if CONDITION-TRUE;then
分支1
else
分支2
fi
双分支if语句实例;
(1)传递一个参数给脚本,此参数为用户名;
(2)如果用户存在,则执行如下任务
(a)如果用户的id号小于500,显示其为管理员或系统用户;
(b)否则,显示其为普通用户;
(3)如果用户不存在,则添加之;
#!/bin/bash if id $1; then userid=`id -u $1` if [ $userid -lt 500 ]; then echo "$1 is sysadmin orsysuser." else echo "A common user." fi else useradd $1 if [ $? -eq 0];then echo "Add user $1 successfully." else echo "Cannot add $1." fi fi
多分支的if语句:
ifCONDITION1-TRUE; then
分支1
elifCONDITION2-TRUE; then
分支2
elif CONDITION3-TRUE; then
分支3
...
else
分支n
fi
传递一个参数给脚本
如果参数为quit,则显示说要退出脚本;
如果参数为yes,则显示说继续;
否则,则显示为无法识别;
#!/bin/bash if $1=quit;then echo "quit" elif $1=yes ;then echo "yes" else echo "no" fi
文件测试
-e$file:是否存在;存在则为真;
-f$file: 文件是否存在,且为普通文件;
-d$file: 是否存在且为目录;
-h$file: 是否存在且为符号链接文件;
-L$file:是否存在且为符号链接文件;
-b$file: 是否存在且为块设备文件;
-c$file: 是否存在且为字符设备文件;
-S$file: 是否存在且为套接字文件;
-p$file: 是否存在且为管道文件;
-r $file: 当前用户对此文件是否拥有读权限;
-w$file: 当前用户对此文件是否拥有写权限;
-x$file: 当前用户对此文件是否拥有执行权限;
-u$file: 文件是否拥有suid权限;
-g$file:文件是否拥有sgid权限;
-k$file: 文件是否拥有sticky权限;
-O$file: 当前用户是否为文件的属主;
-G$file: 当前用户是否属于文件的属组;
-N$file: 文件自从上一次被读取之后,是否被修改过;
$f1-nt $f2: 文件f1是否比文件f2新;
$f1-ot $f2: 文件f1是否比文件f2旧;
$f1-ef $f2: f1和f2是否为同一个文件的硬链接;
文件测试实例
写一个脚本,传递一个文件路径参数给脚本
(1)如果脚本无参数,则显示必须给至少一个参数,退出脚本;退出码5;
(2)路径指向的文件如果不存在,则直接退出脚本;退出码为6;
(3)判断文件类型:
(a)如果是普通文件,则显示为"common file";
(b)如果是目录,则显示为"directory";
(c)如果是符号链接,则显示为"symbolic link file";
(d)如果是块设备,则显示为“block device file";
(e)如果是字符设备,则显示为"character device file";
(f)否则,则显示为“unkown”;
#!/bin/bash if[ $# -lt 1 ]; then echo "At least one argument." exit 5 fi if[ ! -e $1 ]; then echo "No such file." exit 6 fi if[ -f $1 ]; then echo "common file." elif[ -d $1 ]; then echo "directory." elif[ -L $1 ]; then echo "Symbolic link." elif[ -b $1 ]; then echo "block device." elif[ -c $1 ]; then echo "character device." else echo "unkown type." fi
组合测试条件:短路操作符
与:COMMAND1 && COMMAND2
COMMAND1的退出状态如果为假,则COMMAND2不用运行,即可有最终结果;
或:COMMAND1 || COMMAND2
COMMAND1的退出状态如果为真,则COMMAND2不用运行,即可有最终结果;
非:! COMMAND
[! -d /tmp/test ] && mkdir /tmp/test [ -d /tmp/test ] || mkdir /tmp/test
短路操作符实例:写一个脚本实现以下功能
(1)如果httpd进程或nginx进程处于运行中,则显示“web server started.”
(2)否则显示“no web server.”
#!/bin/bash if pidof httpd && pidof nginx ;then echo“web server started” else echo“no web server” fi