如何在bash中增加变量?
我试图使用var=$var+1
和var=($var+1)
来增加数值变量,但没有成功。 变量是一个数字,尽管bash似乎是以字符串forms读取它。
在Ubuntu 13.10上使用Bash版本4.2.45(1)-release(x86_64-pc-linux-gnu)。
在bash中增加变量的方法不止一种,但您尝试的方法不正确。
您可以使用例如算术扩展 :
var=$((var+1)) ((var=var+1)) ((var+=1)) ((var++))
或者您可以使用let
:
let "var=var+1" let "var+=1" let "var++"
另见: http : //tldp.org/LDP/abs/html/dblparens.html 。
var=$((var + 1))
bash中的算术使用$((...))
语法。
各种选择的性能分析
感谢RaduRădeanu的回答 ,它提供了以下方法来增加bash中的变量:
var=$((var+1)) ((var=var+1)) ((var+=1)) ((var++)) let "var=var+1" let "var+=1" let "var++"
还有其他方法。 例如,查看此问题的其他答案。
let var++ var=$((var++)) ((++var)) { declare -i var var=var+1 var+=1 } { i=0 i=$(expr $i + 1) }
有这么多选择会导致这两个问题:
- 它们之间是否存在性能差异?
- 如果是这样,哪个表现最好?
增量性能测试代码:
#!/bin/bash # To focus exclusively on the performance of each type of increment # statement, we should exclude bash performing while loops from the # performance measure. So, let's time individual scripts that # increment $i in their own unique way. # Declare i as an integer for tests 12 and 13. echo > t12 'declare -ii; i=i+1' echo > t13 'declare -ii; i+=1' # Set i for test 14. echo > t14 'i=0; i=$(expr $i + 1)' x=100000 while ((x--)); do echo >> t0 'i=$((i+1))' echo >> t1 'i=$((i++))' echo >> t2 '((i=i+1))' echo >> t3 '((i+=1))' echo >> t4 '((i++))' echo >> t5 '((++i))' echo >> t6 'let "i=i+1"' echo >> t7 'let "i+=1"' echo >> t8 'let "i++"' echo >> t9 'let i=i+1' echo >> t10 'let i+=1' echo >> t11 'let i++' echo >> t12 'i=i+1' echo >> t13 'i+=1' echo >> t14 'i=$(expr $i + 1)' done for script in t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14; do line1="$(head -1 "$script")" printf "%-24s" "$line1" { time bash "$script"; } |& grep user # Since stderr is being piped to grep above, this will confirm # there are no errors from running the command: eval "$line1" rm "$script" done
结果:
i=$((i+1)) user 0m0.992s i=$((i++)) user 0m0.964s ((i=i+1)) user 0m0.760s ((i+=1)) user 0m0.700s ((i++)) user 0m0.644s ((++i)) user 0m0.556s let "i=i+1" user 0m1.116s let "i+=1" user 0m1.100s let "i++" user 0m1.008s let i=i+1 user 0m0.952s let i+=1 user 0m1.040s let i++ user 0m0.820s declare -ii; i=i+1 user 0m0.528s declare -ii; i+=1 user 0m0.492s i=0; i=$(expr $i + 1) user 0m5.464s
结论:
当$i
被声明为整数时,似乎bash在执行i+=1
时最快。 let
语句看起来特别慢, expr
是迄今为止最慢的,因为它不是内置语句。
还有这个:
var=`expr $var + 1`
仔细注意空格,并且“不是”
虽然Radu的答案和评论都是详尽而且非常有用的,但它们是特定于bash的。 我知道你确实特别询问过bash,但是当我想在uCLinux下的busybox中使用sh做同样的事情时,我想我已经找到了这个问题。 这个便携式超越了bash。
如果您将$var
声明为整数,那么您第一次尝试的内容将实际起作用:
$ declare -i var=5 $ echo $var 5 $ var=$var+1 $ echo $var 6
参考: 变量类型,初学者Bash指南
所有答案中都缺少一种方法 – bc
$ VAR=7 $ bc <<< "$VAR+2" 9 $ echo $VAR 7 $ VAR=$( bc <<< "$VAR+1" ) $ echo $VAR 8
bc
由POSIX标准指定,因此应该出现在所有版本的Ubuntu和POSIX兼容系统上。 <<<
重定向可以改变为echo "$VAR" | bc
echo "$VAR" | bc
的可移植性,但由于问题是关于bash
- 只需使用<<<
。
返回码1
问题适用于所有默认变体( let
, (())
等)。 这通常会导致麻烦,例如,在使用set -o errexit
脚本中。 这是我用来防止错误代码1
从数学表达式评估为0
;
math() { (( "$@" )) || true; } math a = 10, b = 10 math a++, b+=2 math c = a + b math mod = c % 20 echo $a $b $c $mod #11 12 23 3