9.7. 双括号结构

类似于let命令,((...))结构允许算术计算和求值. 它最简单的形式a=$(( 5 + 3 )) 会把变量"a"的值设置成"5 + 3"或8. 但是,在Bash中双括号结构也是遵循C风格的变量操作的一种机制.


例子 9-30. 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显然在此偷偷地隐瞒了Bash中双括号的C风格结构
  48 #+ (实际上是从ksh中继承来的,两者非常的接近).
  49 #  在Bash的文档里, Ramey称((...))为shell算术计算,
  50 #+ 但它所能做的远远超出这个.
  51 #  不好意思, Chet,现在秘密已经被揭开了.
  52 
  53 # 参考"for"和"while"循环中使用((...))结构的章节.
  54 
  55 # 这个只能在Bash版本 2.04以上才能工作.
  56 
  57 exit 0

参考例子 10-12.