xie-wen-hui
船帆虽小,却也能远航!

shell 中 {} [] [[ ]] () (( ))的用处和区别

< {}的用处: >
  • 常用

    变量设置方式 说明 实例
    $ 以index下标为界,取index后面所有字符串(包含index的字符)
    $ 以index为界,往后取lenght个字符串
    $ 从右到左匹配变量,以匹配到的最后一个字符串为界,取后面所有字符串 (不包含最后匹配的那个字符串)
    $ 从右到左匹配变量,以匹配到的第一个字符串为界,取后面所有字符串 (不包含最后匹配的那个字符串)
    $ 从左到右匹配变量,以匹配到的最后一个字符串为界,取前面所有字符串 (不包含最后匹配的那个字符串)
    $ 从左到右匹配变量,以匹配到的第一个字符串为界,取前面所有字符串 (不包含最后匹配的那个字符串)
    $ 从左到右匹配,如果变量值中含有旧字符串,则把匹配到第一个旧字符串换成新字符串
    $ 从左到右匹配,如果变量值中含有旧字符串,则把所有匹配到的旧字符串换成新字符串
  • 不常用

变量设置方式 str没设置 str为空字符串 str已设置为非空字符串
var=$ var=表达式 var= var=$str
var=$ var=表达式 var=表达式 var=$str
var=$ var= var=表达式 var=表达式
var=$ var= var= var=表达式
var=$ str=表达式; var=表达式 str(不变) ;var= str(不变) ; var=$str
var=$ str=表达式; var=表达式 str=表达式; var=表达式 str(不变) ; var=$str
var=$ expr 输出到 stderr var= var=$str
var=$ vexpr 输出到 stderr vexpr 输出到 stderr var=$str
< [ ]和[[]]区别: >
# 区别一、 1.当对字符串进行比较时,[]\test是必须对字符串加双引号的“”,而[[]]可加可不加双引号,但是绝对不能加单引号
		  2. 注意:对字符串变量进行比较时,调用变量必须要加双引号,为什么不能是单引号呢?看下面实例
		  
		  
[boy@localhost ~]$ echo $a

[boy@localhost ~]$ test $a = '';echo $?
bash: test: =: 期待一元表达式
2
[boy@localhost ~]$ test '$a' = '';echo $?
1
[boy@localhost ~]$ test "$a" = '';echo $?
0
[boy@localhost ~]$ [ $a = '' ];echo $?
bash: [: =: 期待一元表达式
2
[boy@localhost ~]$ [ '$a' = '' ];echo $?
1
[boy@localhost ~]$ [ "$a" = '' ];echo $?
0
[boy@localhost ~]$ [[ $a = '' ]];echo $?
0
[boy@localhost ~]$ [[ '$a' = '' ]];echo $?
1
[boy@localhost ~]$ [[ "$a" = '' ]];echo $?
0

# 区别二、1.  [ ]支持 -a和-o 在[]内比较,也支持用 &&和||分两个[]比较
				 
			[[]]只支持 && 和 || 分两表达式比较
				不支持 -a和-o在[[ ]]内比较,
				
				
[root@localhost home]# [ -e home  ] && [ -d home ];echo $?
0
[root@localhost home]# [ -e home -a -d home ];echo $?
0
[root@localhost home]# [ -e test.sh  ] || [ -d test.sh ];echo $?
0
[root@localhost home]# [ -e test.sh  -o -d test.sh ];echo $?
0

[root@localhost home]# [[ -e home  ]] && [[ -d home ]];echo $?
0
[root@localhost home]# [[ -e home  -a -d home ]];echo $?
bash: 条件表达式中有语法错误
bash: `-a' 附近有语法错误

[root@localhost home]# [[ -e test.sh  ]] || [[ -d test.sh ]];echo $?
0
[root@localhost home]# [[ -e test.sh  -o  -d test.sh ]];echo $?
bash: 条件表达式中有语法错误
bash: `-o' 附近有语法错误


# 总结
	[]支持: 
    	1. [ 表达式1 -a 表达式2 ] 和 [ 表达式1 ] && [ 表达式2 ]
    	2. [ 表达式1 -o 表达式2 ] 和 [ 表达式1 ] || [ 表达式2 ]
    []不支持:
    	1. 在调用字符串变量时要加"$变量",不能用'$变量'
	[[]]支持:
		1. 在调用字符串变量时可"$变量"或$变量,但绝不能用'$变量'
		2. [[ 表达式1 ]] && [[ 表达式2 ]] 和 [[ 表达式1 ]] || [[ 表达式2 ]]
	[[]]不支持:
		1. [[ 表达式1 -a 表达式2 ] 和 [[ 表达式1 -o 表达式2 ]]
< ()的使用: >
$() 等同于``, 里面可添加命令,作用是把命令的结果装着
< (( )) 和 [[ ]] >
# 代码

# 数字比较

[boy@localhost ~]$ [ 2 \> 3 ];echo $?
1
[boy@localhost ~]$ [ 2 > 3 ];echo $?
0
[boy@localhost ~]$ [[ 2 > 3 ]];echo $?
1
[boy@localhost ~]$ ( 2 > 3 );echo $?
bash: 2: 未找到命令...
127
[boy@localhost ~]$ (( 2 > 3 ));echo $?
1
[boy@

# 字符比较

[boy@localhost ~]$ [[ "aa" = "aa" ]];echo $?
0
[boy@localhost ~]$ [ "aa" = "aa" ];echo $?
0
[boy@localhost ~]$ (( "aa" = "aa" ));echo $?
1
[boy@localhost ~]$ ( "aa" = "aa" );echo $?
bash: aa: 未找到命令...
127


# 总结:
	数字比较:
		[[ ]]: 不用转义 > <
		[ ]: 用转义 > <
		(): 不能比较
		(()): 支持
	字符串比较:
		[[ ]]: 支持
		[ ]: 支持
		(): 不支持
		(()): 不支持
	
	1、(( ))不支持字符串比较
	2、[[ ]]支持字符串、数字比较
	
	
	[]支持: 
    	1. [ 表达式1 -a 表达式2 ] 和 [ 表达式1 ] && [ 表达式2 ]
    	2. [ 表达式1 -o 表达式2 ] 和 [ 表达式1 ] || [ 表达式2 ]
    []不支持:
    	1. 在调用字符串变量时要加"$变量",不能用'$变量'
    	2. 在使用> <进行数字比较需要进行转义
	[[]]支持:
		1. 在调用字符串变量时可"$变量"或$变量,但绝不能用'$变量'
		2. [[ 表达式1 ]] && [[ 表达式2 ]] 和 [[ 表达式1 ]] || [[ 表达式2 ]]
	[[]]不支持:
		1. [[ 表达式1 -a 表达式2 ] 和 [[ 表达式1 -o 表达式2 ]]
posted on 2021-01-17 14:12  xie-wen-hui  阅读(627)  评论(0)    收藏  举报