得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

shell 中各种括号的功能

shell 中能遇到的括号很多,本次涉及的括号有 ()、(())、[]、[[]]、{},后续遇到更多的括号再补充

在入正题之前,先说说 $ 后的一些括号

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

  2. $(command) 命令替换,和 `command` 效果相同,结果为 shell 命令 command 的输出,但是某些版本的 shell 不支持 $() 形式的命令替换, 如 tcsh

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

单括号 ()

  1. 另开命令组

    例:

    1
    $ (ls)
    • 开启一个子 shell 独立运行小括号中的内容
    • 括号中以分号连接,最后一个命令不需要分号
    • 各命令和括号无需空格
  2. 得到命令输出

    例:

    1
    $ a=$(command)
    • 等同于 a=command,得到命令输出赋值给变量 a
  3. 初始化数组

    例:

    1
    $ array=(a b c d)

双括号 (())

  1. 省去 $ 符号的算术运算

    例:

    1
    $ for((i=0;i<5;i++)); if (($i<5)); a=5; ((a++))  # 可将 $a 重定义为 6
    • 括号内支持多个表达式用逗号分开
  2. C 语言规则运算

    例:

    1
    $ $((exp))  # exp 为符合 C 语言规则的运算符,表达式
  3. 跨进制运算

    例:

    1
    2
    $ echo $((16#5f))
    95
    • 二进制、八进制、十六进制运算时,输出结果自动转化成十进制

单中括号 []

  1. 字符串比较

    • == 和 !=
  2. 整数比较

    例:

    1
    2
    3
    $ if [ $i -lt 5 ]
    $ if [ $a -ne 1 -a $a != 2 ]
    $ if [ $a -ne 1] && [ $a != 2 ]
    • -ne: 不等于
    • -gt: 大于
    • -lt: 小于
    • -eq: 等于
  3. 数组索引

双中括号 [[]]

  1. 字符串比较

    例:

    1
    $ [[ hello == hell? ]]  # 结果为真
    • 可以把右边的作为一个模式,而不仅仅是一个字符串
    • [[ ]] 中匹配字符串或通配符,不需要引号
  2. 逻辑运算符

    例:

    1
    $ if [[ $a != 1 && $a != 2 ]]
    • 防止脚本许多逻辑错误,&&、||、< 和 > 操作符能够正常存在于 [[]] 条件判断结构中,但是如果出现在 [] 结构中的话,会报错
  3. 退出码

    • bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码

大括号 {}

  1. 创建匿名函数

    • 不会新开进程,括号内变量余下仍可使用
    • 括号内的命令间用分号隔开,最后一个也必须有分号
    • {} 的第一个命令和左括号之间必须要有一个空格
  2. 字符串操作(见 Shell 字符串截取和替换)

be yourself, everyone else is already taken.