9.7. 双圆括号结构

let命令很相似, ((...))结构允许算术扩展和赋值. 举个简单的例子, a=$(( 5 + 3 )), 将把变量"a"设为"5 + 3", 或者8. 然而, 双圆括号结构也被认为是在Bash中使用C语言风格变量操作的一种处理机制.


例子 9-31. C语言风格的变量操作

  1 #!/bin/bash
  2 # 使用((...))结构操作一个变量, C语言风格的变量操作.
  3 
  4 
  5 echo
  6 
  7 (( a = 23 ))  # C语言风格的变量赋值, "="两边允许有空格.
  8 echo "a (initial value) = $a"
  9 
 10 (( a++ ))     # C语言风格的后置自加.
 11 echo "a (after a++) = $a"
 12 
 13 (( a-- ))     # C语言风格的后置自减.
 14 echo "a (after a--) = $a"
 15 
 16 
 17 (( ++a ))     # C语言风格的前置自加.
 18 echo "a (after ++a) = $a"
 19 
 20 (( --a ))     # C语言风格的前置自减.
 21 echo "a (after --a) = $a"
 22 
 23 echo
 24 
 25 ########################################################
 26 #  注意: 就像在C语言中一样, 前置或后置自减操作
 27 #+ 会产生一些不同的副作用.
 28 
 29 n=1; let --n && echo "True" || echo "False"  # False
 30 n=1; let n-- && echo "True" || echo "False"  # True
 31 
 32 #  感谢, Jeroen Domburg.
 33 ########################################################
 34 
 35 echo
 36 
 37 (( t = a<45?7:11 ))   # C语言风格的三元操作.
 38 echo "If a < 45, then t = 7, else t = 11."
 39 echo "t = $t "        # Yes!
 40 
 41 echo
 42 
 43 
 44 # ------------
 45 # 复活节彩蛋!
 46 # ------------
 47 #  Chet Ramey显然偷偷摸摸的将一些未公开的C语言风格的结构
 48 #+ 引入到了Bash中 (事实上是从ksh中引入的, 这更接近些).
 49 #  在Bash的文档中, Ramey将((...))称为shell算术运算,
 50 #+ 但是它所能做的远远不止于此.
 51 #  不好意思, Chet, 现在秘密被公开了.
 52 
 53 # 你也可以参考一些 "for" 和 "while" 循环中使用((...))结构的例子.
 54 
 55 # 这些只能够在Bash 2.04或更高版本的Bash上才能运行.
 56 
 57 exit 0

参见例子 10-12.