Was ist $ * und $ # in Linux?

82

Was bedeuten die folgenden Umgebungsvariablen in Linux?

  1. Was ist $ * (Dollarzeichen gefolgt von einem Sternchen)?
  2. Was ist $ # (Dollarzeichen neben einem Raute- / Nummern- / Oktothorpe- / Pfundzeichen)?
raghavayc
quelle

Antworten:

115

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 $1ist 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= -yesetc.

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.

Olli
quelle
1
Diese speziellen Parameter gelten für alle von Borowski abgeleiteten Shells (z. B. sh, bash, dash, ash, ksh, zsh).
Dennis Williamson
Korrektur: $*und $#sind 1) Shell-Variablen, keine Umgebungsvariablen; 2) standardisiert (Teil der POSIX-Spezifikation)
Grawity
3
Beachten Sie auch , dass "$@"viele Male , wie geschrieben steht ${1+"$@"}(für die Portabilität Gründen), siehe stackoverflow.com/questions/743454/... für eine Erklärung.
hlovdal
Da 'Der Befehlsname (Parameter 0) nicht gezählt werden soll ...' im obigen Beispiel $ # = 2 sein sollte, beginnend mit 0.
Josef Klimuk
0

$# repräsentiert die Anzahl der Argumente:

[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1

[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3
Vikk_King
quelle
2
Willkommen bei Super User. Die Site ist eine Wissensdatenbank, daher ist beabsichtigt, dass jede Antwort eine Lösung für die Frage darstellt, die noch nicht beigesteuert wurde. Hiermit wird nur die Hälfte der Frage beantwortet, und die Informationen sind in der vorherigen Antwort bereits gut behandelt.
Fixer1234