$@é 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 sua posição: ${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 da chave para os parâmetros 10+, executei um teste em 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 das chaves para os parâmetros do shell é explicado na seção Shell Command Language na expansão Shell Parameter:
O nome ou símbolo do parâmetro pode ser colocado entre chaves, que são opcionais, exceto para parâmetros posicionais com mais de um dígito...
e o $@próprio parâmetro especial é descrito na mesma página na seção Parâmetros especiais .
O $@é de fato uma lista de valores, não uma matriz. A sintaxe da matriz realmente não funciona. Eles são chamados de "Parâmetros Posicionais" e normalmente acessados pela $4sintaxe (por exemplo).
Em bash:
$ set -- a b c d e f g h i j k l m n
$ echo $6
f
$ echo "${11}"
k
$ echo "${@:11:1}"
k
Com um índice:
$ i=11
$ echo "${@:i:1}"
k
$ echo "${!i}"
k
Em shells mais antigos, não há solução a não ser usar eval (cuidado com os riscos):
$ eval 'var=$'"{$i}"
$ echo "$var"
k
rotações
Os loops são fáceis de gerenciar, basta usarfor var; do …; done
$ for pos; do printf '%s:' "$pos"; done; echo
a:b:c:d:e:f:g:h:i:j:k:l:m:n:
O shell disponibiliza automaticamente cada valor na lista para cada loop.
$@
é 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 sua posição:${1}
...${n}
.Como fiquei curioso sobre o comportamento da chave para os parâmetros 10+, executei um teste em vários shells:
Com estes resultados:
O comportamento das chaves para os parâmetros do shell é explicado na seção Shell Command Language na expansão Shell Parameter:
e o
$@
próprio parâmetro especial é descrito na mesma página na seção Parâmetros especiais .O
$@
é de fato uma lista de valores, não uma matriz. A sintaxe da matriz realmente não funciona. Eles são chamados de "Parâmetros Posicionais" e normalmente acessados pela$4
sintaxe (por exemplo).Em bash:
Com um índice:
Em shells mais antigos, não há solução a não ser usar eval (cuidado com os riscos):
rotações
Os loops são fáceis de gerenciar, basta usar
for var; do …; done
O shell disponibiliza automaticamente cada valor na lista para cada loop.