stbyruby 发表于 2019-2-18 09:14:18

linux中的(),(()),[],[[]],{}的作用

  ()
  命令组.在括号中的命令列表, 将会作为一个子shell来运行.
  在括号中的变量,由于是在子shell中,所以对于脚本剩下的部分是不可用的. 父进程, 也就是脚本本身, 将不能够读取在子进程中创建的变量, 也就是在子shell中创建的变量.
  (cmd1;cmd2;cmd3)
  初始化数组.
  Array=(element1 element2 element3)
  $(...)
  相当于`...`命令,返回括号中命令执行的结果
  let命令
  (( ))
  (( ... ))结构可以用来计算并测试算术表达式的结果. 退出状态将会与[ ... ]结构完全相反!还可应用到c风格的for,while循环语句,(( )) 中,所有的变量(加不加$无所谓)都是数值。
  $((...))结构的表达式是C风格的表达式,其返回的结果是表达式值,其中变量引用可不用‘$’(当然也可以)
  for((...;...;...))
  do
  cmd
  done
  while ((...))
  do
  cmd
  done
  比较操作符
  <
  小于
  ((&quot;$a&quot; < &quot;$b&quot;))
   &quot;$b&quot;))
  >=
  大于等于
  ((&quot;$a&quot; >= &quot;$b&quot;))
  (( 0 ))大于0为真,小于0为假
  echo &quot;Exit status of \&quot;(( 0 ))\&quot; is $?.&quot;         # 1
  (( 1 ))
  echo &quot;Exit status of \&quot;(( 1 ))\&quot; is $?.&quot;         # 0
  (( 5 > 4 ))                                    # 真
  echo &quot;Exit status of \&quot;(( 5 > 4 ))\&quot; is $?.&quot;   # 0
  (( 5 > 9 ))                                    # 假
  echo &quot;Exit status of \&quot;(( 5 > 9 ))\&quot; is $?.&quot;   # 1
  (( 5 - 5 ))                                    # 0
  echo &quot;Exit status of \&quot;(( 5 - 5 ))\&quot; is $?.&quot;   # 1
  (( 5 / 4 ))                                    # 除法也可以.
  echo &quot;Exit status of \&quot;(( 5 / 4 ))\&quot; is $?.&quot;   # 0
  (( 1 / 2 ))                                    # 除法的计算结果 < 1.
  echo &quot;Exit status of \&quot;(( 1 / 2 ))\&quot; is $?.&quot;   # 截取之后的结果为 0.
  # 1
  (( 1 / 0 )) 2>/dev/null                        # 除数为0, 非法计算.
  #
  echo &quot;Exit status of \&quot;(( 1 / 0 ))\&quot; is $?.&quot;   # 1
  for ((a=1; acombined_file
  # 把file1, file2, file3连接在一起, 并且重定向到combined_file中.
  cp file22.{txt,backup}
  # 拷贝&quot;file22.txt&quot;到&quot;file22.backup&quot;中
  在大括号中, 不允许有空白, 除非这个空白被引用或转义.
  echo {file1,file2}\ :{\ A,&quot; B&quot;,' C'}
  file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C
  代码块
  这个结构事实上创建了一个匿名函数(一个没有名字的函数). 然而, 与&quot;标准&quot;函数不同的是, 在其中声明的变量,对于脚本其他部分的代码来说还是可见的(除了用declare,typeset命令声明的变量)
  ()会开启一个新的子shell,{}不会开启一个新的子shell
  (())常用于算术运算比较,[[]]常用于字符串的比较.
  $()返回括号中命令执行的结果
  $(())返回的结果是括号中表达式值
  ${ }参数替换与扩展
  参数替换
  ${var}
  ${var}=$var
  ${var:-default}    ${var-default}
  如果var未set,那么就是用default.两者之间不同只有当var为空变量时,前者为default,后者为空.
  ${var:=default}    ${var=default}
  如果var未set,那么就设置default.两者之间不同只有当var为空变量时,前者设置为default,后者设置为空.
  ${var:+default}    ${var+default}
  如果var被set,就是用default.未set,就使用null字符串.两者之间不同只有当var为空变量时,前者为null字符串,后者为default.
  上面三种参数替换中,第二种使用后变量的值被改变.
  参数替换扩展
  ${#var}    ${#array}
  字符串长度或数组第一个元素的字符串长度
  例外:
  ${#*}、${#@}指位置参数的个数.
  ${#array

[*]  },$[#array[@]}指数组元素的个数
  ${var#pattern}    ${var##pattern}
  从var开头删除最近或最远匹配pattern的子串.
  ${var%pattern}    ${var%%pattern}
  从var结尾删除最近或最远匹配pattern的子串.
  ${var:pos}
  变量var从位置pos开始扩展.
  ${var:pos:len}
  从位置pos开始,并扩展len长度个字符
  ${var/pattern/replacement}    ${var//pattern/replacement}
  使用replacement来替换var中的第一个或所有pattern的匹配.
  ${var/#pattern/replacement}
  如果var的前缀匹配到了pattern,那么就用replacement来替换pattern.
  ${var/%pattern/replacement}
  如果var的后缀匹配到了pattern,那么就用replacement来替换pattern.
  ${!varprefix*}    ${!varprefix@}
  前边所有声明过的,以varprefix为前缀的变量名.
  [[]]就是条件表达式,在bash中,字符串比较用> < != == = 只是在[]中 < >需要转义;对于数值比较.用 -lt -le -eq -ge -gt 来比较,与[[]]中表达不太一样,在[ ] 中的 < > 需要用转义 \< \>,如果有多个表达式,在[[ ]] 中用 && || 来组合,而[] 中是用 -a -o 来组合
  在redhat6 中测试 []中不需要转义亦可以使用,

页: [1]
查看完整版本: linux中的(),(()),[],[[]],{}的作用