shell脚本的条件测试与比较
条件测试语法: 语法1:test <测试表达式> 这是利用test命令进行条件测试表达式的方法。 语法2:[ <测试表达式> ]:这是通过单括号进行条件测试表达式的方法,和test命令的用法相同,推荐使用的 语法3:[[ <测试表达式> ]]:这是通过[[]]进行条件测试表达式的方法,是比test和[]更新的语法格式 语法4:((<c测试表达式>)):这是通过(())进行条件表达式的方法,一般用于if语句里 针对上面的说明: 语法1和语法2是相同的,语法3是test的扩展。推荐使用语法2 在[[]]中可以使用通配符等进行模式匹配,这就是区别与其他几种语法格式的地方 &&,||,>,<等操作符可以应用与[[]]中,但不能应用与[]中,在[]中一般用-a,-o,-get(用于整数),-lt(用于整数)代替上面的操作符。 对于整数的关系运算符,也可以使用算术运算符(()) root@ubuntu:/home/xpg#test-f/home/xpg/match.sh&&echogood||echobad good 范例:使用-z测试一个字符串,如果字符串的长度为0则返回真,-n相反 root@ubuntu:/home/xpg#char=oldboy root@ubuntu:/home/xpg#test-z"$char"&&echo1||echo0 0 root@ubuntu:/home/xpg#char= root@ubuntu:/home/xpg#test-z"$char"&&echo1||echo0 1 root@ubuntu:/home/xpg# [ ]和test性质一样,在工作中主要使用这种。 root@ubuntu:/home/xpg#[-f/home/xpg/match.sh]&&echo1||echo0 1 上下的性质是一样的 root@ubuntu:/home/xpg#[-f/home/xpg/match.sh]&&echo1 1 root@ubuntu:/home/xpg#[-f/home/xpg/match.sh]||echo0 root@ubuntu:/home/xpg# 由于test 表达式 和 [ ]是一样的,可以使用man test查看帮助的 root@ubuntu:/home/xpg# [[ -f /home/xpg/match.sh ]] && echo 1 || echo 1 1 [[ ]]和[ ]的区别在于[[ ]]可以使用通配符等进行模式匹配,并且&&,||,>,<等操作符可以应用在[[ ]]中,但不能应用在[ ],在[ ]中一般使用-a,-o,-gt,-lt代替上面的[[ ]]. 文件测试表达式 先补充一点: str1!=str2 当串str1和str2不等时为真 -nstr1 当串的长度大于0时为真(串非空) -zstr1 当串的长度为0时为真(空串) str1 当串str1为非空时为真 !str2当子串为空时为真 int1-eqint2 两数相等为真 int1-neint2 两数不等为真 int1-gtint2 int1大于int2为真 int1-geint2 int1大于等于int2为真 int1-ltint2 int1小于int2为真 int1-leint2 int1小于等于int2为真 -d :文件 文件存在且为目录则是真 -f :文件 文件存在并且为普通文件为真 -e :文件 文件存在则为真,和上面-d,-f的区别是不分辨是目录还是文件 -r :文件 文件存在并且可读则为真 -s :文件 文件存在并且大小不为0则为真 -w :文件 文件存在并且可写为真 -x :文件 文件存在并且可执行为真 -L :文件 文件存在并且为连接文件为真 f1 -nt f2, nt的全拼为newer than 文件f1比文件f2新则为真。 f1 -ot f2;-ot的全拼为older than 文件f1比文件f2旧则为真 使用-e和-d结合使用: root@ubuntu:/home/xpg#[-e/home/xpg/match.sh-a-d/home/xpg/match.sh]&&echo1||echo0 0 生产的启动脚本 例如: root@ubuntu:/home/xpg#[-x/usr/bin/apache2]||exit5#简单的判断,如果这个文件不存在或者不能被执行,返回exit5 exit xpg@ubuntu:~$echo$? 5 xpg@ubuntu:~$ 写出简单高效的测试文件 在做测试判断的时候,不一定非要按照“前面的操作成功了如何,否则如何”的方法,有时候直接部分判断,有时候看起来更加简单。 root@ubuntu:/home/xpg#[-xxpg]&&echo1 root@ubuntu:/home/xpg#[-xxpg]||echo1 1 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |