For legacy reasons, $10
is interpreted as the variable $1
followed by the literal string 0
.
Curly braces are needed to tell the shell that both digits are part of the parameter expansion.
echo "Ninth parameter: $9"
echo "Tenth parameter: $10"
echo "Ninth parameter: $9"
echo "Tenth parameter: ${10}"
If you wanted the trailing digits to be literal, ${1}0
will make this clear to both humans and shellcheck.
In dash
, $10
is (wrongly) interpreted as ${10}
, so some 'reversed' care should also be taken:
bash -c 'set a b c d e f g h i j; echo $10 ${1}0' # POSIX: a0 a0
dash -c 'set a b c d e f g h i j; echo $10 ${1}0' # WRONG: j a0