Frage

Was ist der Sinn für $! in der Schale oder Schalen scripting? Ich versuche, ein Skript zu verstehen, die das so etwas wie die folgenden hat.

local@usr> a=1
local@usr> echo $a
1
local@usr> echo $!a
a

Es ist das Drucken der Variable zurück. Ist es für das? Was sind die anderen $ x Optionen haben wir? Wenige ich kenne, sind $$, $ * $ ?. Wenn jemand mich auf eine gute Quelle verweisen kann, wird es hilfreich sein. BTW, Dies ist in Sun OS 5.8, KSH.

War es hilfreich?

Lösung

Die verschiedenen $… Variablen sind in der Bash Handbuch . Laut Handbuch $! erweitert auf die PID des letzten Prozesses im Hintergrund gestartet. Siehe auch:

$ echo "Foo"
Foo
$ echo $!

$ true&
[1] 67064
$ echo $!
67064
[1]+  Done                    true

In ksh scheint es, dasselbe zu tun.

Andere Tipps

Von der ksh man-Seite auf meinem System:

  ${!vname}
      Expands  to the name of the variable referred to by vname.  This
      will be vname except when vname is a name reference.

Für die Shell Sie fragen, KSH, verwenden Sie die der KSH Handbuch und lesen Sie:

  

Parameter Substitution
       Ein Parameter ist eine Kennung, eine oder mehrere Ziffern oder irgendwelche        die Zeichen *, @, #, -?!., $ und

Es ist klar, dass diejenigen, die akzeptierten Optionen $ sind *, $ @, $ #, $ ?, $ - $$ und $ !.
Mehr in der Zukunft berücksichtigt werden kann.


Für die Parameter $ !, aus dem Handbuch:

  

"!" Die Prozessnummer des letzten Hintergrund Befehls aufgerufen.

Wenn Sie einen Hintergrundprozess, wie sleep 60 & beginnen, dann wird es eine Prozessnummer für einen solchen Prozess, und der Parameter $! gedruckt wird seine Nummer.

$ sleep 60 &
[1] 12329
$ echo "$!"
12329

Wenn kein Hintergrundprozess in der Ausführung ist (wie, wenn die Schale beginnt), ist die exansion leer. Es hat einen Nullwert.

$ ksh -c 'echo $!'

Wenn es ein Hintergrundprozess ist, wird es an den PID eines solchen Verfahrens erweitern:

$  ksh -c 'sleep 30 & echo $!'
42586

Deshalb echo $!a a erweitert. Es ist, weil es keine PID ist zu vermelden:

$  ksh -c 'echo $!a'
a

Andere Schalen können eine andere (in der Regel ziemlich ähnlich) Liste der Erweiterungen (einen Parameter mit nur einem $ und einem nächsten Zeichen).
Zum Beispiel bash diese *@#?-$!0_ als „Spezielle Parameter“ erkennen. Suchen der Bash Handbuch der Überschrift „3.4.2 Spezielle Parameter“.

  

Spezielle Parameter
         Die Schale behandelt mehrere Parameter speziell.

Es gibt die Prozess-ID des letzten backgroundjob oder Hintergrundfunktion Bitte gehen Sie über diesen Link unten

http://www.well.ox.ac.uk/~johnb/comp/unix/ksh.html#specvar

! in Unix ist ein Referenz-Operator, obwohl sie nicht mit diesem Namen genannt.

Es bezieht sich immer auf einen Mutter-Prozess. Versuchen Sie eingeben: in vi, es dauert prompt zu befehlen, und Sie können bis zur Ausfahrt Befehl Befehle wie gewohnt durchführen.

! in SQLPLUS führt auch den Befehl von der Eingabeaufforderung. versuchen Sie dies in sqlplus

SQL>! Ls --- dies gibt die Liste der Dateien inder aktuelles Verzeichnis.

$! -. Natürlich gibt die Prozess-ID des aktuellen / latest Prozess

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top