LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1338|回复: 12

我想知道 $i=$i+1 与 let "i=$i+1" 有什么区别?谢谢

[复制链接]
发表于 2007-3-19 15:47:43 | 显示全部楼层 |阅读模式
我想知道 $i=$i+1  与 let "i=$i+1" 有什么区别,别外还有一个$i=`expr  $i +1`
它们有什么区别啊?
请指点
发表于 2007-3-19 16:20:28 | 显示全部楼层
$i=`expr $i +1`  数值运算
$i=$i+1 与 let "i=$i+1" 是字符串运算
回复 支持 反对

使用道具 举报

发表于 2007-3-20 01:08:38 | 显示全部楼层
  1. i=1
  2. let i=$i+1
  3. echo $i
  4. i=$i+1
  5. echo $i
复制代码
输出:
2
2+1
回复 支持 反对

使用道具 举报

发表于 2007-3-20 01:11:08 | 显示全部楼层
Post by gradetwo

$i=$i+1 与 let "i=$i+1" 是字符串运算

let "i=$i+1"  是数值运算
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-20 09:18:04 | 显示全部楼层
哦,谢谢两位了!
真是一时短路,可以自己调试来看就明白了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-20 10:18:35 | 显示全部楼层
不太对啊
我运行这个代码的时候
#!/bin/bash
e=1
e=`expr $e+1`
echo "$e"
它出现的是1+1啊
回复 支持 反对

使用道具 举报

发表于 2007-3-20 10:34:07 | 显示全部楼层
e=`expr $e + 1

运算符两边需要空格!!这个错误很容易犯`
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-20 11:15:23 | 显示全部楼层
哦,明白了
谢谢哈
回复 支持 反对

使用道具 举报

发表于 2007-3-20 17:58:49 | 显示全部楼层
建议用let,而不是expr.

对比一下:
  1. #!/bin/bash
  2. sum=0;
  3. for ((i=0;i<=1000;i++));
  4. do
  5.         if [[ $1 -eq 0 ]];
  6.         then
  7.                 let sum=$sum+$i;
  8.         else
  9.                 sum=`expr $sum + $i`;
  10.         fi;
  11. done;
  12. echo $sum;
复制代码

运行结果:
  1. time ./test.sh 0
  2. 500500
  3. real    0m0.057s
  4. user    0m0.060s
  5. sys     0m0.000s
复制代码

作为对比:
  1. time ./test.sh 1
  2. 500500
  3. real    0m4.053s
  4. user    0m1.290s
  5. sys     0m1.830s
复制代码

个人感觉是由于expr被多次调用产生了过多的开销。
回复 支持 反对

使用道具 举报

发表于 2007-3-21 09:57:06 | 显示全部楼层
楼上的问题好像是因为let与expr运算实现机制不同吧,具体那个文档现在一时找不到。
let 好像和expr一样转换为整数再计算----由于文档没找到,可能错误。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表