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 Hash-Zeichen/Zahlenzeichen/Oktothorpe/Pfund-Zeichen)?
 92
Author: Der Hochstapler, 2011-02-17

2 answers

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 $# eine Anzahl von Argumenten, die angegeben wurden, als Ihr Skript ausgeführt wurde. $* 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 kommentierte, hier ist 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 von POSIX Standard und sollten von allen kompatiblen Shells unterstützt werden. Als Referenz finden Sie unten POSIX-Standarddefinitionen für jeden speziellen Parameter. Beachten Sie, dass es drei zusätzliche Variablen gibt: $-, $$ und $!.

$@:

Wird auf die Positionsparameter erweitert, beginnend mit einem. Wenn die Erweiterung in Anführungszeichen erfolgt, und wo Feld splitting (siehe Field Splitting) wird durchgeführt, jeder Positionsparameter wird als separates Feld erweitert, wobei vorgesehen ist, dass die Erweiterung des ersten Parameters weiterhin mit dem Anfangsteil des ursprünglichen Wortes verbunden wird (vorausgesetzt, der erweiterte Parameter wurde in ein Wort eingebettet) und die Erweiterung des letzten Parameters weiterhin mit dem letzten Teil des ursprünglichen Wortes verbunden wird. Wenn keine Positionsparameter vorhanden sind, soll die Erweiterung von '@' Null erzeugen felder, auch wenn ' @ ' doppelt zitiert ist.

$*:

Wird auf die Positionsparameter erweitert, beginnend mit einem. Wenn die Erweiterung innerhalb einer Zeichenfolge 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 a getrennt ist wenn IFS nicht gesetzt ist. Wenn IFS ist auf einen null-string, dieser ist nicht gleichwertig zu entfernen es; seine ersten Zeichen nicht vorhanden, so dass die parameterwerte werden verkettet.

$#:

Wird auf die Dezimalzahl der Positionsparameter erweitert. Der Befehlsname (Parameter 0) darf nicht in der von '#' angegebenen Zahl gezählt werden, da es sich um einen speziellen Parameter und nicht um einen Positionsparameter handelt.

$?:

Wird auf den dezimalen Exit-Status der letzten Pipeline erweitert (siehe Pipelines).

$-:

(Bindestrich.) Erweitert auf die aktuelle Optionsflags (die in eine Zeichenfolge verketteten Optionsnamen mit einem Buchstaben), wie beim Aufruf angegeben, durch den speziellen integrierten Befehl set oder implizit durch die Shell.

$$:

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

$!:

Wird auf die Dezimalzahl erweitert prozess-ID des letzten Hintergrundbefehls (siehe Lists), der von der aktuellen Shell ausgeführt wird. (Zum Beispiel haben Hintergrundbefehle, die von Subshells ausgeführt werden, keinen Einfluss auf den Wert von"$!"in der aktuellen shell-Umgebung.) Für eine 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 ist ableiten.

 129
Author: Olli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2015-04-12 19:23:55

$# repräsentiert die Anzahl der Argumente:

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

[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3
 -1
Author: Vikk_King,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-09-24 09:07:47