shell当中的{},(),(()),[],[[]]各种括号用法详解


{}大括号

{}用于执行命令

[root@zaishu ~]# var="zhangsan"; { echo $var;var="lisi";echo $var;}; echo $var
zhangsan
lisi
lisi

解释:

  • {}最后一个命令要用分号
  • {}的第一个命令和左括号之间必须要有一个空格
  • ()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
  • { list; } 不会启子shell, 在当前shell中运行,会影响当前shell环境,所以最后一个echo $var的输出是lisi

()小括号

用途

  • 命令集合,括号内的命令会在一个子shell中执行,注意与[]的区分
  • 命令替换。等同于`cmd`, 语法:$(cmd)结构
    将$(cmd)中的cmd执行,得到其输出。
  • 用于初始化数组。如:array=(a b c d)

演示

  • 用作命令集合
[root@zaishu ~]# var="zhangsan" ; ( echo $var;var="lisi";echo $var ); echo $var
zhangsan
lisi
zhangsan
  • 用作命令替换
[root@zaishu ~]# echo $(date)
Mon 17 Jan 20:29:35 EST 2022
[root@zaishu ~]# echo `date`
Mon 17 Jan 20:29:40 EST 2022
  • 用作初始化数组
[root@zaishu ~]# a1=(a b c d)

()和{}区别

()和{}都是对一串的命令进行执行,但有所区别:

  • ()只是对一串命令重新开一个子shell进行执行
  • {}对一串命令在当前shell执行
  • ()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
  • ()最后一个命令可以不用分号
  • {}最后一个命令要用分号
  • {}的第一个命令和左括号之间必须要有一个空格
  • ()里的各命令不必和括号有空格
  • ()和{}中括号里面的命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令
  • ()只是对一串命令重新开一个子shell进行执行,里面的变量值,不会直接影响外面所以还是zhangsan
  • 命令之间用;号隔开
[root@zaishu ~]# var="zhangsan"; { echo $var;var="lisi";echo $var;}; echo $var
zhangsan
lisi
lisi  // 大括号的变量值,会影响括号外。
[root@zaishu ~]# var="zhangsan" ; ( echo $var;var="lisi";echo $var ); echo $var
zhangsan
lisi
zhangsan  // 小括号的变量值,不会影响括号外。

(())双小括号

双小括号 (( )) 是 Bash Shell 中专门用来进行整数运算的命令,不能对小数(浮点数)或者字符串进行运算。

语法

Shell (( )) 语法
((表达式))
简单而言就是将数学运算表达式放在())

表达式可以有一个或多个,表达式之间用逗号分隔。最后一个表达式的值作为整个 (( )) 命令的执行结果。可以使用 获 取 ( ( ) ) 命 令 的 结 果 , 这 和 使 用 获取 (( )) 命令的结果,这和使用 (())使获得变量值是类似的。

运算操作符/运算命令 说明
((a=10+66)
((b=a-15))
((b=a-15))
这种写法可以在计算完成后给变量赋值。以 ((b=a-15)) 为例,即将 a-15 的运算结果赋值给变量 c。
a=$((10+66)
b=$((a-15))
c=$((a+b))
可以在 (( )) 前面加上 符 号 获 取 ( ( ) ) 命 令 的 执 行 结 果 , 也 即 获 取 整 个 表 达 式 的 值 。 以 c = 符号获取 (( )) 命令的执行结果,也即获取整个表达式的值。以 c= (())c=((a+b)) 为例,即将 a+b 这个表达式的运算结果赋值给变量 c。注意,类似 c=((a+b)) 这样的写法是错误的,不加$就不能取得表达式的结果。
((a>7 && b==c)) (( )) 也可以进行逻辑运算,在 if 语句中常会使用逻辑运算。
echo $((a+10)) 需要立即输出表达式的运算结果时,可以在 (( )) 前面加$符号。
((a=3+5, b=a+10)) 对多个表达式同时进行计算。

在 (( )) 中使用变量无需加上$前缀,(( )) 会自动解析变量名,这使得代码更加简洁,也符合程序员的书写习惯。

演示

  • 利用 (( )) 进行简单的数值计算。
[root@zaishu ~]# ((a=10+22))
[root@zaishu ~]# echo $(())
0
[root@zaishu ~]# echo $a
32
[root@zaishu ~]# echo $((2+2))
4
[root@zaishu ~]# echo $((2*2))
4
[root@zaishu ~]# echo $((2*3))
6
  • 用 (( )) 进行复杂算术运算。
[root@zaishu ~]# ((a=1+2**3-4%3))
[root@zaishu ~]# echo $a
8
  • 利用 (( )) 进行逻辑运算。
[root@zaishu ~]# echo $((100>1000))  结果是不成立的,因此,输出了 0,0 表示假。
0
[root@zaishu ~]# echo $((3<8)) 结果是成立的,因此,输出了 1,1 表示真
1

[root@zaishu ~]# echo $((3==3)) 判断是否相等。
1
[root@zaishu ~]# if ((100>10&&100==100)); then echo yes; fi
yes
  • 利用 (( )) 进行自增或自减运算
[root@zaishu ~]# a=10
[root@zaishu ~]# echo $((a++))
10
[root@zaishu ~]# echo $a
11
[root@zaishu ~]# echo $((++a))
12
[root@zaishu ~]# echo $a
12
  • 利用 (( )) 同时对多个表达式进行计算。
    [root@zaishu ~]# ((a=3+5, b=a+10))
    [root@zaishu ~]# echo $a $b
    8 18

[root@zaishu ~]# c=$((4+8, a+b))
[root@zaishu ~]# echo $c
26

()与(())的区别

( ):括号内的命令会在一个子shell中执行
(( )):将括号内的数值进行比较与运算
$( ):命令替换,等同于反引号
$(( )):整数运算
{ }:对括号内的一组字符进行操作
${ }:变量的引用
[ ]:条件测试
[[ ]]:支持正则表达式的条件测试,进行正则匹配时不再是=,而是=~
$[ ]:整数运算

[]单中括号

通常用于条件判断

注意因素

  • [ ] 两个符号左右都要有空格分隔
  • 内部操作符与操作变量之间要有空格:如 [ “a” = “b” ]
  • 字符串比较中,> < 需要写成\> \< 进行转义:如 [ “a” < “b” ]
  • \字符串变量尽量使用"" 双引号扩住,避免值未定义引用而出错
  • [ ] 中可以使用 –a –o 进行逻辑运算
  • [ ] 是bash 内置命令

[[ ]]双中括号

通常用于条件判断

注意因素

  • [[ ]] 两个符号左右都要有空格分隔
  • 内部操作符与操作变量之间要有空格:如 [[ “a” = “b” ]]
  • 字符串比较中,可以直接使用 > < 无需转义。如 [[ “a” < “b” ]]
  • [[ ]] 中字符串如未使用"" ,可以通过==和=~进行模式和正则表达式匹配
  • [[] ] 内部可以使用 && || 进行逻辑运算
  • [[ ]] 是关键字
  • [[ ]] 其他用法都和[ ] 一样
  • [[ ]] 和 [ ] 都可以和 ! 配合使用

[[ ]] 比[ ] 具备的优势

  • [[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
  • 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
  • 使用[[ … ]]条件判断结构,而不是[… ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。
  • bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

总结: 尽量使用[[ … ]]条件判断结构, 而不是[ ], 能够防止脚本中的许多逻辑错误. 比如,&&, ||, <, 和> 操作符能够正常存在于[[]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错。

总结

shell当中的{},(),(()),[],[[]]各种括号用法详解