Antworten:
Von hier :
$# Stores the number of command-line arguments that
were passed to the shell program.
$? Stores the exit value of the last command that was
executed.
$0 Stores the first word of the entered command (the
name of the shell program).
$* Stores all the arguments that were entered on the
command line ($1 $2 ...).
"$@" Stores all the arguments that were entered
on the command line, individually quoted ("$1" "$2" ...).
Im Grunde genommen $#
wird eine Reihe von Argumenten angegeben, als Ihr Skript ausgeführt wurde. $*
ist eine Zeichenfolge, die alle Argumente enthält. Zum Beispiel $1
ist das erste Argument und so weiter. Dies ist nützlich, wenn Sie auf ein bestimmtes Argument in Ihrem Skript zugreifen möchten.
Wie Brian bemerkte, ist hier ein einfaches Beispiel. Wenn Sie folgenden Befehl ausführen:
./command -yes -no /home/username
$#
= 3$*
= -yes -no /home/username
$@
= Array: {"-yes", "-no", "/home/username"}
$0
= ./command
, $1
= -yes
etc.Diese sind Teil des POSIX-Standards und sollten von allen kompatiblen Shells unterstützt werden. Als Referenz finden Sie unten die POSIX-Standarddefinitionen für jeden speziellen Parameter. Sie beachten gibt es drei weitere Variablen: $-
, $$
und $!
.
$@
:
Erweitert die Positionsparameter, beginnend mit eins. Wenn die Erweiterung in doppelten Anführungszeichen erfolgt und wenn eine Feldaufteilung (siehe Feldaufteilung ) durchgeführt wird, wird jeder Positionsparameter als separates Feld erweitert, mit der Maßgabe, dass die Erweiterung des ersten Parameters weiterhin mit dem Anfangsteil von verknüpft wird Das ursprüngliche Wort (unter der Annahme, dass der erweiterte Parameter in ein Wort eingebettet wurde) und die Erweiterung des letzten Parameters werden weiterhin mit dem letzten Teil des ursprünglichen Wortes verbunden. Wenn keine Positionsparameter vorhanden sind, erzeugt die Erweiterung von '@' Nullfelder, auch wenn '@' in doppelte Anführungszeichen gesetzt wird.
$*
:
Erweitert die Positionsparameter, beginnend mit eins. Wenn die Expansion innerhalb eines Strings in doppelten Anführungszeichen auftritt (siehe doppelte Anführungszeichen ), wird er von dem ersten Zeichen des IFS - Variable oder durch eine getrennt auf ein einzelnes Feld mit dem Wert der einzelnen Parameter erweitern , wenn IFS nicht gesetzt ist. Wenn IFS auf eine Nullzeichenfolge festgelegt ist, entspricht dies nicht dem Deaktivieren der Zeichenfolge. Das erste Zeichen ist nicht vorhanden, daher werden die Parameterwerte verkettet.
$#
:
Wird auf die Dezimalzahl der Positionsparameter erweitert. Der Befehlsname (Parameter 0) wird in der durch '#' angegebenen Zahl nicht mitgezählt, da es sich um einen speziellen Parameter und nicht um einen Positionsparameter handelt.
$?
:
Wird auf den Dezimal-Exit-Status der letzten Pipeline erweitert (siehe Pipelines ).
$-
:
(Bindestrich.) Wird auf die aktuellen Optionsflags (die aus einem Buchstaben bestehenden Optionsnamen, die zu einer Zeichenfolge verkettet sind) erweitert, wie beim Aufruf, durch den speziellen Befehl set oder implizit durch die Shell angegeben.
$$
:
Wird auf die dezimale Prozess-ID der aufgerufenen Shell erweitert. In einer Subshell (siehe Shell-Ausführungsumgebung ) wird '$' auf denselben Wert wie den der aktuellen Shell erweitert.
$!
:
Wird auf die dezimale Prozess-ID des letzten Hintergrundbefehls (siehe Listen ) erweitert, der von der aktuellen Shell ausgeführt wird. (Hintergrundbefehle, die von Subshells ausgeführt werden, wirken sich beispielsweise nicht auf den Wert von "$!" In der aktuellen Shell-Umgebung aus.) Bei einer Pipeline ist die Prozess-ID die des letzten Befehls in der Pipeline.
$0
:
(Null.) Wird auf den Namen der Shell oder des Shell-Skripts erweitert. Siehe sh für eine detaillierte Beschreibung, wie dieser Name abgeleitet wird.
$*
und $#
sind 1) Shell-Variablen, keine Umgebungsvariablen; 2) standardisiert (Teil der POSIX-Spezifikation)
"$@"
viele Male , wie geschrieben steht ${1+"$@"}
(für die Portabilität Gründen), siehe stackoverflow.com/questions/743454/... für eine Erklärung.
$#
repräsentiert die Anzahl der Argumente:
[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1
[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3