博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell内置命令test单双括号的区别
阅读量:7176 次
发布时间:2019-06-29

本文共 2753 字,大约阅读时间需要 9 分钟。

 

1、单括号TEST命令要对变量进行单词分离,当变量值包含空白符时,要用引号将变量括起来;而双括号的TEST命令不会对变量进行单词分离。

以下情况分为变量为单个单词,含有空格的词组。

[root@www yujia]# echo $name       

hello

[root@www yujia]# [ $name = "hello" ]

[root@www yujia]# echo $?

0

[root@www yujia]# [[ $name = "hello" ]]

[root@www yujia]# echo $?             

0

[root@www yujia]#

得出结论,因为变量只有一个单词嘛,单双括号的单词分离都没有影响到这个变量了。

[root@www yujia]# echo $name1       

hello world

[root@www yujia]# [ $name1 = "hello world" ]

-bash: [: too many arguments

[root@www yujia]# echo $?

2

[root@www yujia]# [ "$name1" = "hello world" ]

[root@www yujia]# echo $?

0

[root@www yujia]# [[ $name1 = "hello world" ]]

[root@www yujia]# echo $?

0

[root@www yujia]#

这次变量是一个词组了,带空格那种了。当我们要测试时,结果发现BASH回应参数太多了,这是怎么回事呢?原来是单引号TEST命令对变量进行单词分离了,结果也就变成了

[ hello world = "hello world" ],多了那个字符串hello,成了字符串world和字符串hello world之间的比较了。因此如果在单括号的TEST命令中的变量含有空格,但它还得和字符串比较,那就必须给变量加个双引号了,这时它就不会发生错误了。而在下面的双括号的TEST命令中,即使变量含有空格又何妨,因为它不能对变量单词进行分离嘛。

 

2、单方括号的TEST命令,通常用内置的TEST命令来测试表达式的值,TEST命令也被链接到方括号上。这样,既可以使用单独的TEST命令,也可以通过把表达式用单方括号括起来,来测试表达式的值。

[root@www yujia]# ll abc

-rw-r--r-- 1 root root 0 Sep 24 08:59 abc

[root@www yujia]# test -r abc ; echo $?

0

[root@www yujia]# [ -r abc ] ; echo $?             

0

[root@www yujia]#

 

3、单括号的TEST命令不对SHELL元字符进行扩展的,而双括号TEST命令则会对SHELL元字符进行扩展的了。

[root@www yujia]# name=tom

[root@www yujia]# [ $name = t?? ]

[root@www yujia]# echo $?

1

[root@www yujia]# [[ $name = t?? ]]

[root@www yujia]# echo $?          

0

[root@www yujia]#

 

4、在双括号的TEST命令当中,如果一个字符串(不管含不含有空格)仅仅是在表达式中作为一个普通字符串,而不是一个模式的一部分,则它也必须用引号括起来。

我的理解是如果一个字符串值(右边那个的了)不加双引号,那这个字符串就是模式来的,如果它里面有含有SHELL元字符,BASH会对它进行扩展。如果字符串加了双引号,那它就是一个很普通的字符串的,即便字符串里面里面含有特殊字符,也就是当普通内容来处理。

 

[root@www yujia]# echo $name

tom

[root@www yujia]# echo $name1

tomm

 [root@www yujia]# [[ $name = tom ]]      

[root@www yujia]# echo $?

0

[root@www yujia]# [[ $name = tom? ]]

[root@www yujia]# echo $?          

1

[root@www yujia]# [[ $name1 = tom ]]

[root@www yujia]# echo $?          

1

[root@www yujia]# [[ $name1 = tom? ]]

[root@www yujia]# echo $?           

0

[root@www yujia]#

[root@www yujia]# [[ $name = "tom" ]]

[root@www yujia]# echo $?           

0

 [root@www yujia]# [[ $name = "tom?" ]]

[root@www yujia]# echo $?            

1

 [root@www yujia]# [[ $name1 = "tom" ]]

[root@www yujia]# echo $?             

1

[root@www yujia]# [[ $name1 = "tom?" ]]

[root@www yujia]# echo $?             

1

 

5、[ express1 –a express2 ] 这是放在单括号的TEST命令中的,因为单的不支持元字符扩展,因此就只能叫做表达式了,它们可以组合构成逻辑测试的,不过与或非使用( -a –o !)的形式。

[root@www yujia]# ll mm

-r--r--r-- 2 root root 644 Sep 24 08:48 mm

[root@www yujia]# [ -r mm -a -x mm ]

[root@www yujia]# echo $?

1

[root@www yujia]#

 

[[pattern1 –a pattern1]] 这是放在双括号TEST命令中的,因为单条式子可以支持元字符嘛,所以可以叫做模式表达式了,也就可以用于复合逻辑了,不过与或非使用(&& || !)的形式了。

[root@www yujia]# echo $name
tom
[root@www yujia]# [[ $name = [tT]om && $name = t?? ]]
[root@www yujia]# echo $?
0
[root@www yujia]#

本文转自 kuSorZ 51CTO博客,原文链接:http://blog.51cto.com/kusorz/1710918

转载地址:http://tbpzm.baihongyu.com/

你可能感兴趣的文章
js 自动生成下拉树
查看>>
win7恢复文件关联的方法
查看>>
MYSQL备份
查看>>
我的友情链接
查看>>
Android 如何让service 不被杀死 && service 开机自动启动
查看>>
微信订阅号开发笔记(二)
查看>>
2012年中国存储市场发展趋势浅谈
查看>>
前端css笔记第一天
查看>>
分别在服务器、数据库、表和列级别设置mysql字符集和校验规则
查看>>
如何编写一个拼写纠错器?
查看>>
Leetcode#153Find Minimum in Rotated Sorted Array
查看>>
我的友情链接
查看>>
Linux HA Cluster概述
查看>>
关于autofs自动挂载工具 问题
查看>>
基于mod_ssl模块实现httpd对ssl的支持
查看>>
apache加入chkconfig
查看>>
JavaScript概述、语法、保留关键字、变量
查看>>
计算机应用专业的学生应该掌握的IT技能
查看>>
关于JSP里面的表单提交
查看>>
Redis服务器设置密码和无密码攻 击
查看>>