Shell高级编程7:Shell的字符串表达式介绍

字符串测试操作符

  字符串测试操作符的作用:比较两个字符串是否相同、字符串长度是否为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
View Code

例子演示

[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
View Code

 等号两端空格带来的问题

[root@node1 ~]# [ "abc"="1" ] && echo 1 || echo 0
1
[root@node1 ~]# [ "abc" = "1" ] && echo 1 || echo 0
0
View Code

注意:字符测试表达式中变量 要加双引号,以免判断时出错,导致结果错误

不加引号

[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
View Code

 范例:系统脚本/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
        }

 

posted @ 2019-08-31 11:35  晨羽曦13  阅读(213)  评论(0编辑  收藏  举报