bash算术运算((V++))和((V=V+1))的差异
2018-10-16 本文已影响1人
CodingCode
今天不小心踩了一个坑,把他记在这里。
我们在循环的时候通常会用一个变量计算循环了多次;这个变量每次循环累加1。
常见的写法有:
typeset NUM=0
while <condition>; do
<actions>
((NUM++))
done
或者:
typeset NUM=0
while <condition>; do
<actions>
((NUM=NUM+1))
done
((NUM++)和((NUM=NUM+1)有什么区别吗。
- 对变量NUM来说效果是一样的,没有区别。
- 但是副作用不一样,即语句的返回值不一样。
如下:
#!/bin/bash
typeset NUM1=0
((NUM1++))
echo "NUM1=${NUM1}, \$?=$?"
typeset NUM2=0
((NUM2=NUM2+1))
echo "NUM2=${NUM1}, \$?=$?"
运行结果为:
NUM1=1, $?=1
NUM2=1, $?=0
((V++))这种方式会把表达式的值作为返回值,从而会影响后面的判断逻辑。
另一例子:
#!/bin/bash
typeset NUM1=0
typeset NUM2=0
typeset VAL1=0
typeset VAL2=0
VAL1=$((NUM1++))
echo "VAL1=${VAL1}, NUM1=$NUM1, \$?=$?"
VAL2=$((NUM2=NUM2+1))
echo "VAL2=${VAL2}, NUM2=$NUM2, \$?=$?"
运行结果:
VAL1=0, NUM1=1, $?=0
VAL2=1, NUM2=1, $?=0
VAL1的值是1,post-increment操作先把NUM1的值赋给VAL1,然后再计算NUM1加1操作。