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

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.


J'aurais dû reconnaître la substitution de paramètres immédiatement là. Bonne prise.
Sergiy Kolodyazhnyy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.