Arithmetic Expansion
Remarks#
Numbers in arithmetic expansions must match the following ERE:
[-+]?(0[0-7]+|[1-9][0-9]*|0[Xx][0-9A-Fa-f]+)Arithmetic expressions support signed integer operators, comparisons, Boolean expressions, assignments, and ternary expressions from C.
Resources
Line Count
i=0
while read -r line; do
i=$((i+1))
done < file
echo $iWith a file containing:
Alpha
Beta
Gamma
Delta
EpsilonThe above script prints: 5
Parameter Expansion
Loop n times:
while [ $((i=${i:=0}+1)) -le "$n" ]; do
echo line $i
doneOutput for n=5:
line 1
line 2
line 3
line 4
line 5Manipulating decimals:
$ i=3.14159; echo $((${i%.*}*2))
6
$ i=3.14159; echo $((${i#*.}*2))
28318Ternery Expressions
Absolute value:
$ for n in -8 -2 0 3 4; do
> echo $((n<0?-n:n))
> done
8
2
0
3
4Fix variable range:
$ min=2
$ max=4
$ for n in 1 2 3 4 5; do
> echo $((n<min?min:n>max?max:n))
> done
2
2
3
4
4Is a Power of 2
$ ispow2() { return $((!($1!=0&&($1&$1-1)==0))); }
$ i=0
$ while [ $i -lt 100 ]; do
> if ispow2 $((i=i+1)); then
> echo $i
> fi
> done
1
2
4
8
16
32
64$1!=0 0 is not a power of 2.
($1&$1-1)==0 Unset the lowest bit. If it was the only bit then the number was a power of 2.
The additional ! was for correcting the value to what the shell expects, which is the opposite of the conventional true/false values
(zero for true and non-zero for false, vs zero for false and non-zero for true).