mainnet icon indicating copy to clipboard operation
mainnet copied to clipboard

Unnecessary use of $ / ${} with arithmetic variable - Critical anti-pattern

Open philipjonsen opened this issue 2 years ago • 0 comments

Use of $ or ${..} on regular variables in arithmetic context is unnecessary, and can even lead to subtle bugs. This is because the content of $((..)) is first expanded into a string, and then evaluated as an expression:

$ a='1+1' $ echo $(($a * 5)) # becomes 1+1*5 6 $ echo $((a * 5)) # evaluates as (1+1)*5 10 The $ is unavoidable for special variables like $1 vs 1, $# vs #.

It is also required when adding modifiers to parameters expansions, like ${#var} or ${var%-}.

PROBLEMATIC CODE:

echo $(($n + ${arr[i]})) PREFERRED CODE:

echo $((n + arr[i]))

You can find $/${} is unnecessary on arithmetic variables here:

/mainnet/blob/main/shentu-2.2/statesync/state_sync.sh#L13-L13

philipjonsen avatar Sep 22 '23 17:09 philipjonsen