如何在bash中增加变量?

我试图使用var=$var+1var=($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) } 

有这么多选择会导致这两个问题:

  1. 它们之间是否存在性能差异?
  2. 如果是这样,哪个表现最好?

增量性能测试代码:

 #!/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