Bei dem Versuch, den letzten Positionsparameter einzustellen /bin/dash
, habe ich es versucht echo ${$#}
. Überraschenderweise führte dies nicht zu einem Fehler, sondern zu einer PID, die mit $$
variablen Inhalten identisch ist. Frage, warum hat diese Syntax funktioniert? Welche Syntaxregel hat die Shell hier angewendet?
Grundsätzlich habe ich getan
$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819
Anscheinend wird der %
Charakter in einem solchen Konstrukt auch ignoriert
$ echo ${$%}
13819
Aber *
und das @
führt zu einem schlechten Substitutionsfehler:
$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution
${$*}
und${$@}
produzieren Sie?#
und ausprobiert%
und welches Verhalten daraus resultiert.eval
zdash -c 'set 1 2 3 4 5; eval "echo \$$#"'
. Quelle: Ubuntu Wikifor i; do true; done
ich das letzte Element bearbeiten musste$i
), habe aber nach etwas Eleganterem gesucht.eval
Natürlich kann es potenzielle Probleme geben, inwieweit gedacht - das ist ein anderes Thema. Aber ja, es ist eine OptionAntworten:
Dies ist
$$
mit einem leeren Präfix entfernt :Gleiches gilt für
%
(Suffix).@
und*
sind keine Parametererweiterungsmodifikatoren, daher handelt es sich um Fehler. Es würde passieren , für$?
,$-
oder eine hypothetische$=
als auch.${$+}
ist eine leere Erweiterung.quelle