man bash
lautet:
Special Parameters The shell treats several parameters specially. These parameters may only be referenced; assignment to them is not allowed.
Nun, shift
ändert sowohl @
als auch *
(natürlich auf die gleiche Weise). Und weist tatsächlich und set -- one two three
zu, was ich will .@
*
Interpretiere ich also die man
Angaben auf den Seiten falsch?
Antwort1
Sie können keine Zuweisungen an spezielle Parameter vornehmen. Sie können den Zuweisungsoperator ( 1=foo
, @=(foo bar)
, ?=0
, …) nicht verwenden. Sie können die Erweiterungskonstruktion für Zuweisungsparameter ( ${1=foo}
, …) nicht verwenden.
Natürlich können Sie sie ändern, aber Sie müssen eine indirekte Methode außer der Zuweisung verwenden, z. B. set
(mit Argumenten ohne Optionen) oder shift
integrierte Funktionen zum Festlegen der Positionsparameter und $#
( set
mit Optionen) zum Ändern $-
, Ausführen eines Befehls zum Festlegen $?
usw.
Ausnahmsweise können Sie tatsächlich an zuweisen _
, obwohl dies normalerweise nicht funktioniert ( _=foo a=$_
setzt a
auf foo
und _
auf die leere Zeichenfolge).
Antwort2
Der Kern Ihrer Frage liegt darin, was eine Aufgabe ist. man bash
definiert es anscheinend nicht, aberDie POSIX-Spezifikation hat ein Wort dazu:
4.23 Variablenzuweisung
In der Shell-Befehlssprache ein Wort, das aus den folgenden Teilen besteht:
Varname=Wert
Sie können die speziellen Parameter $@
und $*
mit einigen in der Shell integrierten Mitteln ändern, aber Sie können ihnen keine Zuweisung schreiben. Ich würde sagen, sie wurden mit Bedacht gewählt, denn es würde tatsächlich sehr unnatürlich aussehen, wenn man sie schreibt *=string
, sogar für nicht so geschulte Augen.