shell中测试命令单中括号与双中括号的区别

本文详细介绍了Shell脚本中单括号和双括号TEST命令的区别与应用,包括变量处理、元字符扩展、逻辑表达式等方面的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载于https://blog.youkuaiyun.com/good_habits/article/details/27708745 略有改动
1.单括号TEST命令要对变量进行单词分离,当变量值包含空白符时,要用引号将变量括起来;而双括号的TEST命令不会对变量进行单词分离。
以下情况分为变量为单个单词,含有空格的词组。
[root@www yansan]# echo $name       
hello
[root@www yansan]# [ $name = "hello" ]
[root@www yansan]# echo $?
0
[root@www yansan]# [[ $name = "hello" ]]
[root@www yansan]# echo $?             
0
[root@www yansan]#
得出结论,因为变量只有一个单词嘛,单双括号的单词分离都没有影响到这个变量了。
[root@www yansan]# echo $name1       
hello world
[root@www yansan]# [ $name1 == "hello world" ]
-bash: [: too many arguments
[root@www yansan]# echo $?
2
[root@www yansan]# [ "$name1" == "hello world" ]
[root@www yansan]# echo $?
0
[root@www yansan]# [[ $name1 == "hello world" ]]
[root@www yansan]# echo $?
0

2.单方括号的TEST命令,通常用内置的TEST命令来测试表达式的值,TEST命令也被链接到方括号上。这样,既可以使用单独的TEST命令,也可以通过把表达式用单方括号括起来,来测试表达式的值。
[root@www yansan]# ll abc
-rw-r--r-- 1 root root 0 Sep 24 08:59 abc
[root@www yansan]# test -r abc ; echo $?
0
[root@www yansan]# [ -r abc ] ; echo $?             
0
[root@www yansan]#
 
3.单括号的TEST命令不对SHELL元字符进行扩展的,而双括号TEST命令则会对SHELL元字符进行扩展的了。
[root@www yansan]# name=tom
[root@www yansan]# [ $name == t?? ]
[root@www yansan]# echo $?
1
[root@www yansan]# [[ $name == t?? ]]
[root@www yansan]# echo $?          
0
[root@www yansan]#
 
4.在双括号的TEST命令当中,如果一个字符串(不管含不含有空格)仅仅是在表达式中作为一个普通字符串,而不是一个模式的一部分,则它也必须用引号括起来。
我的理解是如果一个字符串值(右边那个的了)不加双引号,那这个字符串就是模式来的,如果它里面有含有SHELL元字符,BASH会对它进行扩展。如果字符串加了双引号,那它就是一个很普通的字符串的,即便字符串里面里面含有特殊字符,也就是当普通内容来处理。
 
[root@www yansan]# echo $name
tom
[root@www yansan]# echo $name1
tomm
 [root@www yansan]# [[ $name == tom ]]      
[root@www yansan]# echo $?
0
[root@www yansan]# [[ $name == tom? ]]
[root@www yansan]# echo $?          
1
[root@www yansan]# [[ $name1 == tom ]]
[root@www yansan]# echo $?          
1
[root@www yansan]# [[ $name1 == tom? ]]
[root@www yansan]# echo $?           
0
[root@www yansan]#
[root@www yansan]# [[ $name == "tom" ]]
[root@www yansan]# echo $?           
0
 [root@www yansan]# [[ $name == "tom?" ]]
[root@www yansan]# echo $?            
1
 [root@www yansan]# [[ $name1 == "tom" ]]
[root@www yansan]# echo $?             
1
[root@www yansan]# [[ $name1 == "tom?" ]]
[root@www yansan]# echo $?             
1
 
5.[ express1 –a express2 ] 这是放在单括号的TEST命令中的,因为单的不支持元字符扩展,因此就只能叫做表达式了,它们可以组合构成逻辑测试的,不过与或非使用( -a –o !)的形式。
[root@www yansan]# ll mm
-r--r--r-- 2 root root 644 Sep 24 08:48 mm
[root@www yansan]# [ -r mm -a -x mm ]
[root@www yansan]# echo $?
1
[root@www yansan]#
 
[[pattern1 –a pattern1]] 这是放在双括号TEST命令中的,因为单条式子可以支持元字符嘛,所以可以叫做模式表达式了,也就可以用于复合逻辑了,不过与非或使用(&& || !)的形式了。
[root@www yansan]# echo $name
tom
[root@www yansan]# [[ $name = [tT]om && $name = t?? ]]
[root@www yansan]# echo $?
0
的,因为单条式子可以支持元字符嘛,所以可以叫做模式表达式了,也就可以用于复合逻辑了,不过与非或使用(&& || !)的形式了。

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

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值