it-swarm.com.de

Was ist $ * und $ # in Linux?

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)?
79
raghavayc

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 ...).
"[email protected]"  Stores all the arguments that were entered
      on the command line, individually quoted ("$1" "$2" ...).

$# ist also im Grunde genommen eine Reihe von Argumenten, die bei der Ausführung Ihres Skripts angegeben wurden. $* ist eine Zeichenfolge, die alle Argumente enthält. Zum Beispiel ist $1 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
  • [email protected] = array: {"-yes", "-no", "/home/username"}
  • $0 = ./command, $1 = -yes usw.

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. Beachten Sie, dass es drei zusätzliche Variablen gibt: $-, $$ und $!.

[email protected]:

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 erfolgt wird mit dem Anfangsteil des ursprünglichen Wortes verbunden (vorausgesetzt, der erweiterte Parameter wurde in ein Wort eingebettet), und die Erweiterung des letzten Parameters wird 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 Erweiterung in doppelten Anführungszeichen erfolgt (siehe Double-Quotes ), wird sie zu einem einzelnen Feld erweitert, wobei der Wert jedes Parameters durch das erste Zeichen der IFS-Variablen oder durch ein if getrennt wird IFS ist nicht gesetzt. 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 integrierten Befehl set oder implizit durch die Shell angegeben.

$$:

Wird auf die dezimale Prozess-ID der aufgerufenen Shell erweitert. In einer Subshell (siehe Shell Execution Environment ) wird '$' auf denselben Wert wie den der aktuellen Shell erweitert.

$!:

Wird auf die dezimale Prozess-ID des zuletzt ausgeführten 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.

110
Olli

$# steht für die Anzahl der Argumente:

[[email protected] ~]# set -- a
[[email protected] ~]# echo $#
1

[[email protected] ~]# set -- a b c
[[email protected] ~]# echo $#
3
0
Vikk_King