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 ]]








浙公网安备 33010602011771号