Ao tentar obter o último parâmetro posicional definido /bin/dash
, tentei echo ${$#}
. Surpreendentemente, isso não resultou em um erro, mas no PID, que é o mesmo que o $$
conteúdo da variável. Pergunta, é por que essa sintaxe funcionou? Qual é a regra de sintaxe que o shell aplicou aqui?
Basicamente, o que eu fiz é
$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819
Aparentemente, o %
personagem também é ignorado nesse construto
$ echo ${$%}
13819
Mas *
e @
resultar em erro de substituição incorreto:
$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution
${$*}
e${$@}
produzir?#
e%
e qual comportamento resultados daqueles.eval
, por exemplodash -c 'set 1 2 3 4 5; eval "echo \$$#"'
. Fonte: Ubuntu Wikifor i; do true; done
que era o último item$i
), mas estava procurando algo mais elegante.eval
é claro que pode haver problemas em potencial, pensados até que ponto - esse é outro tópico. Mas sim, é uma opçãoRespostas:
Isso ocorre
$$
com um prefixo vazio removido :O mesmo se aplica a
%
(sufixo).@
e*
não são modificadores de expansão de parâmetro, portanto, são erros. Isso iria acontecer para$?
,$-
ou uma hipotética$=
também.${$+}
é uma expansão vazia.fonte