不像其他程序语言一样, Bash并不对变量区分"类型". 本质上, Bash变量都是字符串. 但是依赖于具体的上下文, Bash也允许比较操作和整数操作. 其中的关键因素就是, 变量中的值是否只有数字.
例子 4-4. 整型还是字符串?
1 #!/bin/bash 2 # int-or-string.sh: 整型还是字符串? 3 4 a=2334 # 整型. 5 let "a += 1" 6 echo "a = $a " # a = 2335 7 echo # 还是整型. 8 9 10 b=${a/23/BB} # 将"23"替换成"BB". 11 # 这将把变量b从整型变为字符串. 12 echo "b = $b" # b = BB35 13 declare -i b # 即使使用declare命令也不会对此有任何帮助. 14 echo "b = $b" # b = BB35 15 16 let "b += 1" # BB35 + 1 = 17 echo "b = $b" # b = 1 18 echo 19 20 c=BB34 21 echo "c = $c" # c = BB34 22 d=${c/BB/23} # 将"BB"替换成"23". 23 # 这使得变量$d变为一个整形. 24 echo "d = $d" # d = 2334 25 let "d += 1" # 2334 + 1 = 26 echo "d = $d" # d = 2335 27 echo 28 29 # null变量会如何呢? 30 e="" 31 echo "e = $e" # e = 32 let "e += 1" # 算术操作允许一个null变量? 33 echo "e = $e" # e = 1 34 echo # null变量将被转换成一个整型变量. 35 36 # 如果没有声明变量会怎样? 37 echo "f = $f" # f = 38 let "f += 1" # 算术操作能通过么? 39 echo "f = $f" # f = 1 40 echo # 未声明的变量将转换成一个整型变量. 41 42 43 44 # 所以说Bash中的变量都是不区分类型的. 45 46 exit 0 |
不区分变量的类型既是幸运的事情也是悲惨的事情. 它允许你在编写脚本的时候更加的灵活(但是也足够把你搞晕!), 并且可以让你能够更容易的编写代码. 然而, 这也很容易产生错误, 并且让你养成糟糕的编程习惯.
这样的话, 程序员就承担了区分脚本中变量类型的责任. Bash是不会为你区分变量类型的.
与命令很相似, ((...))结构允许算术扩展和赋值. 举个简单的例子, 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 |
一个简单的列子:
1 #!/bin/bash 2 3 var0=0 4 LIMIT=10 5 6 while [ "$var0" -lt "$LIMIT" ] 7 do 8 echo -n "$var0 " # -n 将会阻止产生新行. 9 # ^ 空格, 数字之间的分隔. 10 11 var0=`expr $var0 + 1` # var0=$(($var0+1)) 也可以. 12 # var0=$((var0 + 1)) 也可以. 13 # let "var0 += 1" 也可以. 14 done # 使用其他的方法也行. 15 16 echo 17 18 exit 0