web-dev-qa-db-fra.com

Que signifie $ {! #} Dans les scripts Shell?

J'ai trouvé ceci dans un script Shell malveillant obscurci, commençant par:

${!#}${*^} <<<...

Impossible de trouver une référence à ${!#}, mais lorsque echo 'd, il affiche -bash. S'agit-il d'un référent secret au shell en cours d'exécution? Pourquoi y a-t-il alors un tiret supplémentaire?

Merci!

26
Dai

Cette réponse est spécifique à bash, car vous avez essayé echo dans bash. Tous les obus ne se comportent pas de la même manière.

Dans bash, si $var1 est foo, puis ${!var1} est le même que $foo. Le ! est expansion indirecte : il fait que bash récupère de la variable donnée un nom de variable (foo) au lieu d'une valeur .

Remplacez maintenant var1 avec #. $# est le nombre d'arguments. Si $# est 0, ${!#} est $0. Si $# est 4, ${!#} est $4. En d'autres termes, ${!#} est le dernier paramètre positionnel, quel que soit le nombre de paramètres positionnels.

S'il n'y a pas de paramètres de position, $# est 0, donc le résultat est $0, qui est le nom du shell ou du script ( référence ). Dans votre cas, c'était bash (plus un en tête - ce qui signifie qu'il s'agit d'un shell de connexion).

Test rapide:

$ echo ${!#}
-bash

$ set the quick brown fox

$ echo ${!#}
fox