字符串测试操作符
字符串测试操作符的作用:比较两个字符串是否相同、字符串长度是否为0,字符串是否为 NULL(注:bash区分零长度字符串和空字符串)等
在书写测试表达式时,可以使用下表中的字符串测试操作符。
下表:字符串测试操作符
常用字符串测试操作符 | 两端 |
-z | 若串长度为0则真,-z可以理解为zero |
-n | 若串长度不为0则真,-z可以理解为no zero |
"串1" = "串2" | 若串1等于串2则真,可使用"=="代替"=" |
"串1" != "串2" | 若串1不等于串2则真 |
特别注意,以上表格中的字符串测试操作符务必要用""引起来 1、以上表格中的字符串测试操作符号务必要用""引起来 2、比较符号两端有空格 |
字符串测试操作符提示:
-n 比较字符串长度是否不为0,如果不为0则为真,如:[ -n "$myvar" ]
-z 比较字符串长度是否等于0,如果等于0则为真,如:[ -z "$myvar" ]
特别注意,对以上表格中的字符串测试操作符号,如[ -n "$myvar" ],要把字符串用''引起来
注意事项:
1、字符串或字符串变量比较都要加双引号之后再比较
2、字符串或字符串变量比较,比较符号两端最好都有空格,学习shell多参考系统脚本
"="比较两个字符串是否相同,与"=="等价,如[ "$a" = "$b" ],其中$a这样的变量最好用""括起来,因为如果中间有空格,*等符号就可能出错了,当然更好的方法就是[ "${a}" = "${b}" ]
"!="比较两个字符串是否相同,不同则为"是"
[root@node1 ~]# sed -n '30,31p' /etc/init.d/network # Check that networking is up. [ "${NETWORKING}" = "no" ] && exit 6 错误例子:https://blog.51cto.com/oldboy/1433688
例子演示
[root@node1 ~]# [ -n "abc" ] && echo 1 || echo 0 1 [root@node1 ~]# [ -n "" ] && echo 1 || echo 0 0 [root@node1 ~]# [ -z "abcdef" ] && echo 1 || echo 0 0 [root@node1 ~]# [ ! -z "abcdef" ] && echo 1 || echo 0 1 [root@node1 ~]# [ -n "abcdef" ] && echo 1 || echo 0 1 [root@node1 ~]# test="chenxi" [root@node1 ~]# [ -n "$test" ] && echo 1 || echo 0 1 [root@node1 ~]# [ -n $test ] && echo 1 || echo 0 1 [root@node1 ~]# [ -z $test ] && echo 1 || echo 0 0 [root@node1 ~]# [ $test = chenxi ] && echo 1 || echo 0 1 [root@node1 ~]# [ "$test" = "chenxi" ] && echo 1 || echo 0 1 [root@node1 ~]# [ "$test"="chenxi" ] && echo 1 || echo 0 1 [root@node1 ~]# [ $test=chenxi ] && echo 1 || echo 0 1
等号两端空格带来的问题
[root@node1 ~]# [ "abc"="1" ] && echo 1 || echo 0 1 [root@node1 ~]# [ "abc" = "1" ] && echo 1 || echo 0 0
注意:字符测试表达式中变量 要加双引号,以免判断时出错,导致结果错误
不加引号
[root@node1 ~]# [ $test = abc ] && echo 1 || echo 0 -bash: [: =: unary operator expected 0 [root@node1 ~]# [ $test = "abc" ] && echo 1 || echo 0 -bash: [: =: unary operator expected 0 [root@node1 ~]# [ "$test" = "abc" ] && echo 1 || echo 0 0
范例:系统脚本/etc/init.d/nfs字符串测试的应用(若没有该文件,则安装nfs-utils包)
[root@node1 init.d]# sed -n '86,90p' /etc/init.d/nfs # Load the nfsd module so /proc/fs/nfsd will exist [ "$NFSD_MODULE" != "noload" -a -x /sbin/modprobe ] && { /sbin/modprobe nfsd [ -n "$RDMA_PORT" ] && /sbin/modprobe svcrdma }