Pourquoi $ {$ #} renvoie-t-il le même résultat que $$ dans le shell?

18

En essayant d'obtenir le dernier paramètre positionnel /bin/dash, j'ai essayé echo ${$#}. Étonnamment, cela n'a pas entraîné une erreur, mais un PID qui est identique au $$contenu des variables. Question, pourquoi cette syntaxe a-t-elle fonctionné? Quelle est la règle de syntaxe que le shell applique ici?

En gros, ce que j'ai fait c'est

$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819

Apparemment, le %personnage est également ignoré dans une telle construction

$ echo ${$%}
13819

Mais *et @entraîner une mauvaise erreur de substitution:

$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution
Sergiy Kolodyazhnyy
la source
3
Qu'attendez-vous ${$*}et que vous ${$@}produirez?
Kusalananda
2
@Kusalananda Aucune attente. Je tentais d' autres personnages à côté #et %et les résultats du comportement de ceux -ci .
Sergiy Kolodyazhnyy
1
Pour réellement faire une indirection dans Dash, utilisez eval, par exemple dash -c 'set 1 2 3 4 5; eval "echo \$$#"'. Source: Ubuntu Wiki
wjandrea
1
@wjandrea Oui, déjà au courant de celui-là. En fait, il y a déjà une question à ce sujet: stackoverflow.com/questions/1853946/… J'essayais de trouver une méthode par moi-même sans lire la question d'abord (et je savais déjà comment insérer lefor i; do true; done dernier élément $i) mais je cherchais quelque chose de plus élégant. evalbien sûr, il peut y avoir des problèmes potentiels, dans quelle mesure - c'est un autre sujet. Mais oui, c'est une option
Sergiy Kolodyazhnyy

Réponses:

35

C'est $$ avec un préfixe vide supprimé :

${parameter#[word]}

Supprimer le plus petit modèle de préfixe . Le mot doit être développé pour produire un motif. L'extension du paramètre doit alors aboutir à un paramètre , la plus petite partie du préfixe correspondant au motif étant supprimée. S'il est présent, le mot ne doit pas commencer par un non cité #.

Il en va de même pour %(suffixe). @et *ne sont pas des modificateurs d'extension de paramètres, ce sont donc des erreurs. Cela se produirait pour $?, $-ou hypothétique $=aussi. ${$+}est une extension vide.

Michael Homer
la source
J'aurais dû reconnaître la substitution de paramètres immédiatement là. Bonne prise.
Sergiy Kolodyazhnyy