Chinaunix首页 | 论坛 | 博客
  • 博客访问: 659497
  • 博文数量: 198
  • 博客积分: 4256
  • 博客等级: 上校
  • 技术积分: 1725
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-15 13:12
文章分类

全部博文(198)

文章存档

2012年(12)

2011年(39)

2010年(135)

2009年(12)

我的朋友

分类: LINUX

2010-03-20 11:32:35

不像其他程序语言一样, 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
阅读(1490) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~