$@
é um "parâmetro especial" não uma matriz; portanto, você não pode acessá-lo como uma matriz. Você pode acessar os parâmetros diretamente, usando a posição deles: ${1}
... ${n}
.
$ set -- a b c d e f g h i j k l m n
$ echo "$#"
14
$ echo "${10}"
j
Como fiquei curioso sobre o comportamento de chaves para os parâmetros 10+, executei um teste contra vários shells:
for shell in ash bash dash fish ksh mksh posh rc sash yash zsh
do
printf "The %s shell outputs: %s\n" "$shell" "$($shell -c 'set -- a b c d e f g h i j k l m n; echo $10')"
done
Com estes resultados:
The ash shell outputs: j
The bash shell outputs: a0
The dash shell outputs: j
The fish shell outputs:
The ksh shell outputs: a0
The mksh shell outputs: a0
The posh shell outputs: a0
rc: cannot find 'set'
The rc shell outputs:
The sash shell outputs: j
The yash shell outputs: a0
The zsh shell outputs: j
O comportamento de chaves para os parâmetros do shell é explicado na Linguagem de comando do shell seção na expansão do parâmetro Shell:
The parameter name or symbol can be enclosed in braces, which are optional except for positional parameters with more than one digit ...
e o próprio parâmetro $@
special são descritos na mesma página nos Parâmetros especiais seção.