2011-02-17 18:53:26 +0000 2011-02-17 18:53:26 +0000
83
83

Was bedeuten $* und $# in Linux?

Was bedeuten die folgenden Umgebungsvariablen in Linux?

  1. Was bedeutet $* (Dollarzeichen gefolgt von einem Sternchen)?
  2. Was bedeutet $# (Dollarzeichen neben einem Rautezeichen/Zahlenzeichen/Oktogonalzeichen/Pfundzeichen)?

Antworten (2)

117
117
117
2011-02-17 18:59:34 +0000

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 ist $# also die Anzahl der Argumente, die bei der Ausführung Ihres Skripts angegeben wurden. $* ist eine Zeichenkette, 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 wollen.

Wie Brian kommentiert hat, ist hier ein einfaches Beispiel. Wenn Sie den folgenden Befehl ausführen:

./command -yes -no /home/username
  • $# = 3
  • $* = -yes -no /home/username
  • $@ = array: {"-yes", "-no", "/home/username"}
  • $0 = ./command, $1 = -yes usw.

Diese sind Teil des POSIX-Standards , und sollten von allen konformen Shells unterstützt werden. Als Referenz finden Sie unten die POSIX-Standarddefinitionen für jeden speziellen Parameter. Bitte beachten Sie, dass es drei zusätzliche Variablen gibt: $-, $$ und $!.

$@:

Expandiert zu den Positionsparametern, beginnend bei eins. Wenn die Expansion innerhalb von Anführungszeichen erfolgt und eine Feldaufteilung (siehe Feldaufteilung ) durchgeführt wird, wird jeder Positionsparameter als separates Feld expandiert, mit der Maßgabe, dass die Expansion des ersten Parameters noch mit dem Anfangsteil des ursprünglichen Wortes verbunden wird (unter der Annahme, dass der expandierte Parameter in ein Wort eingebettet wurde) und die Expansion des letzten Parameters noch mit dem letzten Teil des ursprünglichen Wortes verbunden wird. Wenn keine Positionsparameter vorhanden sind, muss die Expansion von ‘@’ Nullfelder erzeugen, auch wenn ‘@’ in Anführungszeichen steht.

$*:

Expandiert bis zu den Positionsparametern, beginnend bei eins. Wenn die Expansion innerhalb einer Zeichenkette mit doppelten Anführungszeichen erfolgt (siehe Doppelte Anführungszeichen ), wird sie auf ein einzelnes Feld erweitert, wobei der Wert jedes Parameters durch das erste Zeichen der IFS-Variablen oder durch ein getrennt wird, wenn IFS nicht gesetzt ist. Wenn IFS auf eine Null-Zeichenkette gesetzt ist, ist dies nicht gleichbedeutend mit dem Aufheben der Einstellung; das erste Zeichen existiert nicht, so dass die Parameterwerte konkateniert werden.

$#:

Erweitert um die dezimale Anzahl der Positionsparameter. Der Befehlsname (Parameter 0) wird in der durch ‘#’ angegebenen Anzahl nicht mitgezählt, da es sich um einen speziellen Parameter und nicht um einen Positionsparameter handelt.

$?:

Erweitert um den dezimalen Ausgangsstatus der letzten Pipeline (siehe Pipelines ).

$-:

(Bindestrich.) Erweitert auf die aktuellen Optionsflags (die aus einzelnen Buchstaben bestehenden Optionsnamen, die zu einer Zeichenkette verkettet sind), wie beim Aufruf, durch den speziellen eingebauten Befehl set oder implizit durch die Shell angegeben.

$$:

Erweitert um die dezimale Prozess-ID der aufgerufenen Shell. In einer Subshell (siehe Shell-Ausführungsumgebung ) expandiert ‘$’ auf denselben Wert wie der der aktuellen Shell.

$!:

Erweitert sich auf die dezimale Prozess-ID des letzten Hintergrundbefehls (siehe Listen ), der von der aktuellen Shell aus ausgeführt wurde. (Hintergrundbefehle, die von Subshells aus ausgeführt werden, haben beispielsweise keinen Einfluss auf den Wert von “$!” in der aktuellen Shell-Umgebung.) Bei einer Pipeline ist die Prozess-ID die des letzten Befehls in der Pipeline.

$0:

(Null.) Erweitert um den Namen der Shell oder des Shell-Skripts. Siehe sh für eine detaillierte Beschreibung, wie dieser Name abgeleitet wird.

0
0
0
2018-09-24 05:34:09 +0000

$# steht für die Anzahl der Argumente:

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

[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3