How to Increment a Variable in Bash?
I Have Tried to Increment a Numeric Variable Using Both Var=$Var+1 and Var=($Var+1) Without Success. the Variable Is a Number, Though Bash Appears to Be...
I have tried to increment a numeric variable using both var=$var+1 and var=($var+1) without success. The variable is a number, though bash appears to be reading it as a string.
Bash version 4.2.45(1)-release (x86_64-pc-linux-gnu) on Ubuntu 13.10.
9 Answers
There is more than one way to increment a variable in bash, but what you tried will not work.
You can use, for example, arithmetic expansion:
var=$((var+1))
((var=var+1))
((var+=1))
((var++))
Or you can use let:
let "var=var+1"
let "var+=1"
let "var++"
See also: .
var=$((var + 1))
Arithmetic in bash uses $((...)) syntax.
Various options to increment by 1, and performance analysis
Thanks to Radu Rădeanu's answer that provides the following ways to increment a variable in bash:
var=$((var+1))
((var=var+1))
((var+=1))
((var++))
let "var=var+1"
let "var+=1"
let "var++"
There are other ways too. For example, look in the other answers on this question.
let var++
var=$((var++))
((++var))
{
declare -i var
var=var+1
var+=1
}
{
i=0
i=$(expr $i + 1)
}
Having so many options leads to these two questions:
- Is there a performance difference between them?
- If so which, which performs best?
Must Read
Incremental performance test code:
#!/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 -i i; i=i+1'
echo > t13 'declare -i i; 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