shellshell中各种括号的作用()(())[][[]]{}

Posted 绣春刀啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shellshell中各种括号的作用()(())[][[]]{}相关的知识,希望对你有一定的参考价值。

1.(())使用语法:
((表达式))用来扩展Shell中的算术运算,以及赋值运算,扩展for,while,if条件测试运算.

注意点:
1.在双括号结构中,所有的表达式可以像c语言一样,如a++,b--
2.在双括号结构中,所有变量可以不加入$符号前缀,也可以加入.
3.在双括号可以进行逻辑运算,四则运算,而且运算符合数值之间可以没有空格,也可以有空格.
4.双括号结构扩展了for,while,if条件测试运算.
5.支持多个表达式运算,各个表达式之间用逗号,分开.
6.使用[]时必须保证运算符与数值之间有空格,而(())时数值与运算符可以没有空格.

小技巧:
1.新建(()).sh文件vim "(()).sh",因为()在shell中有特殊含义,只能用"括起来,用单引号也是不行的.
2.使用文件时:vim (()).sh,可以在要使用的含有特殊符号的文件前面添加一个转义符号然后可以按提示按补全.

例子:求100以内的偶数
#! /bin/bash

num=2

while ((num<100)) #数值与运算符可以没有空格,变量的使用时也可以不使用$num
do
echo "$num"
((num=num*2))
done
1
2
3
4
5
6
7
8
9
结果:

[root@yveshe ~]# ./(()).sh
2
4
8
16
32
64

2.()和{}

多条命令执行

(1)单小括号,(cmd1;cmd2;cmd3) 新开一个子shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号。

(2)单大括号,{ cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。
对{}和()而言, 括号中的重定向符只影响该条命令, 而括号外的重定向符影响到括号中的所有命令。

1)${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。

(2)$(cmd) 命令替换,和`cmd`效果相同,结果为shell命令cmd的输,过某些Shell版本不支持$()形式的命令替换, 如tcsh。

(3)$((expression)) 和`exprexpression`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。


()和{}都是对一串的命令进行执行,但有所区别:
相同点:
()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
不同点
()只是对一串命令重新开一个子shell进行执行,{}对一串命令在当前shell执行
()最后一个命令可以不用分号,{}最后一个命令要用分号
()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必须要有一个空格
()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令

3.双中括号[[ ]]

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

总结:

  (1)$(cmd)与··(键盘上1左边的~)一样,都是命令替换,可以将执行结果提取出来

  (2)[]使用的时候[  ]前后都必须有空格,且两个字符或数字之间的比较符左右也必须有空格。

  (3)   []是test的另一种形式,[]中间只能使用= 和 != 比较字符串,如果使用< 、>需要进行转义。

    []中间如果比较数字需要用 -lt 等符号,不能使用<比较数字,会当成字符串处理。

  (4)[[]]可用于处理逻辑命令,也可以用于处理字符串是否相等,且使用<、>不用转义符.

  (5)(())可用于比较数字,且不用转义,而且也可以用于数字计算,比较的时候也是用普通的>,<。(())计算的时候运算符与数字之间不能有空格,例如: sum=$(($sum+4))

  (6)字符串比较 用[],与普通的<,>,=,!=符号,如果使用<,>需要转义;或者使用[[]]比较字符串也是用普通符号不用转义

    数字比较用[]的时候用-lt,-gt等符号,不能使用<(因为会当成字符串处理);或者用(())比较数字用普通符号不用转义

  (7)可以将$理解为取变量的符号,$var 或者 ${}  ,在不影响语义的情况下可以省去{},但是最好写上{}。例如:test=XXX.$testWWWW.这时候就必须加上{}变为${test}WWWW

以上是关于shellshell中各种括号的作用()(())[][[]]{}的主要内容,如果未能解决你的问题,请参考以下文章

shell中各种括号的作用

shell中各种括号的作用()(())[][[]]{}

shell中各种括号的作用()(())[][[]]{}

shell中各种括号的作用()(())[][[]]{}

shell中各种括号的作用()(())[][[]]{}

Shell中各种括号的作用