Was sind die speziellen Dollarzeichen-Shell-Variablen?

782

In Bash scheint es mehrere Variablen zu geben, die spezielle Werte mit konsistenter Bedeutung enthalten. Zum Beispiel,

./myprogram &; echo $!

gibt die PID des Prozesses zurück, der im Hintergrund ausgeführt wurde myprogram. Ich kenne andere, von $?denen ich denke, dass sie das aktuelle TTY sind. Gibt es noch andere

Z Douglas
quelle
15
Einige von ihnen sind nicht nur Bash. Sie werden auch in anderen Bourne-bezogenen Shells verwendet und tatsächlich von POSIX spezifiziert .
Bis auf weiteres angehalten.
1
Was ist mit: IFS = $ '\ n' Siehe: stackoverflow.com/questions/4128235/…
sgu
1
@sgu Das ist kein Parameter; Das ist eine besondere Art des Zitierens. $'\n'ist ein wörtliches Zeilenumbruchzeichen, das sich aus dem Ersetzen des Digraphen \ndurch ASCII 10
ergibt
Wenn Sie hierher gekommen ${1}sind ${*}, um usw. zu suchen , dienen die Zahnspangen nur der Begriffsklärung und sind häufig überflüssig. Für sich genommen ${x}ist das genau gleichbedeutend mit $x.
Tripleee
Was heißt $!das Ich bin mir dessen bewusst, !$aber nicht.
Sridhar Sarnobat

Antworten:

1359
  • $1, $2, $3, ... sind die Positionsparameter .
  • "$@"ist ein Array-ähnliches Konstrukt aller Positionsparameter {$1, $2, $3 ...}.
  • "$*"ist die IFS-Erweiterung aller Positionsparameter $1 $2 $3 ....
  • $# ist die Anzahl der Positionsparameter.
  • $- Aktuelle Optionen für die Shell festgelegt.
  • $$ pid der aktuellen Shell (keine Subshell).
  • $_ letzter Parameter (oder der abs-Pfad des Befehls zum Starten der aktuellen Shell unmittelbar nach dem Start).
  • $IFS ist das (Eingabe-) Feldtrennzeichen.
  • $? ist der letzte Status beim Beenden der Vordergrundpipeline.
  • $! ist die PID des letzten Hintergrundbefehls.
  • $0 ist der Name der Shell oder des Shell-Skripts.

Die meisten der oben genannten Informationen finden Sie unter Spezielle Parameter im Bash-Referenzhandbuch. Es gibt alle von der Shell festgelegten Umgebungsvariablen .

Einen umfassenden Index finden Sie im Referenzhandbuch Variablenindex .

Kojiro
quelle
2
Sie sind alle in der bashManpage dokumentiert . Die einzige Kuriosität ist, dass sie $_nur im Zusammenhang mit ihrer Verwendung in der MAILPATHVariablen erwähnt wird.
Chepper
4
@chepner sucht man(1) bashunter Spezielle Parameter nach dem Rest der Definition von $_.
Kojiro
8
Ich verwende !$statt $_in Bash-Skripten, weil letztere manchmal fehlschlagen.
Amc
Schöne Liste Kojiro. Ich bin auf diese Syntax gestoßen $ {1 + "$ @"} Was bedeutet das?
user178047
3
@amc: Unter unix.stackexchange.com/questions/271659/… finden Sie Unterschiede zwischen !$und $_.
Trikasse
44
  • $_ letztes Argument des letzten Befehls
  • $# Anzahl der an das aktuelle Skript übergebenen Argumente
  • $*/ $@Liste der Argumente, die als Zeichenfolge / begrenzte Liste an das Skript übergeben wurden

von oben auf meinen Kopf. Google für Bash spezielle Variablen.

Dan
quelle
124
"Das habe ich. Sie haben mich hierher geschickt." - Buchhandlung Sketch (offizielles Dokument: gnu.org/software/bash/manual/bashref.html#Special-Parameters )
Greggo
1
Ich denke, es $@ist die Zeichenfolge und $*die begrenzte Liste (gemäß der oben akzeptierten Antwort jedenfalls).
RastaJedi
1
@RastaJedi: Erweitert "$@"sich zu einer Liste, "$*"erweitert sich zu einer einzelnen Zeichenfolge. Das besondere Verhalten von $@gilt, wenn es in doppelten Anführungszeichen steht.
Keith Thompson
6
Abgestimmt, da dies keine sehr vollständige oder hilfreiche Antwort ist. Die Aussage "Google it" zeigt einen Mangel an Aufwand, insbesondere angesichts der Tatsache, dass die überwiegende Mehrheit der Menschen von der Google-Suche hierher kommt. Ich denke, das Mindeste, was Sie tun können, ist, Links zur offiziellen Dokumentation hinzuzufügen. TBH, der einzige Grund, warum ich es nicht zum Löschen markiert habe, war, dass es zumindest eine teilweise Antwort auf die Frage ist. Ich weiß, dass es alt ist, aber bitte überlegen Sie, es zu bearbeiten, um mehr Details zu erhalten.
Sean the Bean
15

Um zu verstehen, was zu tun $#ist $0und $1..., $nverwende ich dieses Skript:

#!/bin/bash

for ((i=0; i<=$#; i++)); do
  echo "parameter $i --> ${!i}"
done

Wenn Sie es ausführen, wird eine repräsentative Ausgabe zurückgegeben:

$ ./myparams.sh "hello" "how are you" "i am fine"
parameter 0 --> myparams.sh
parameter 1 --> hello
parameter 2 --> how are you
parameter 3 --> i am fine
fedorqui 'SO hör auf zu schaden'
quelle
4
Was bedeutet das! Ich meine in deiner for-Schleife? Deshalb bin ich hier und kann nirgendwo eine Antwort finden, weil ich nicht weiß, wie ich es nennen soll.
Anthony
7
@Anthony Dies wird als variable Indirektion bezeichnet . Sie können eine gute Erklärung seiner Verwendung in bash finden: indirekte Erweiterung, bitte erklären Sie? .
Fedorqui 'SO hör auf zu schaden'
3

Achten Sie auf einige Beispiele. $ 0 kann einen führenden Pfad sowie den Namen des Programms enthalten. Speichern Sie dieses zweizeilige Skript beispielsweise als ./mytry.sh und führen Sie es aus.

#!/bin/bash

echo "parameter 0 --> $0" ; exit 0

Ausgabe:

parameter 0 --> ./mytry.sh

Dies ist eine aktuelle (Jahr 2016) Version von Bash über Slackware 14.2

Adrian Cole
quelle
5
Ob $ 0 einen Pfad enthält oder nicht, hängt davon ab, wie Sie das Skript überhaupt ausgeführt haben. Wenn Sie "./mytry.sh" ausgeführt haben, sehen Sie dies in $ 0. Wenn Sie "~ / mytry.sh" eingegeben haben, wird der vollständige Pfad angezeigt (da die Shell ~ erweitert hat). Wenn Sie ". Mytry.sh" gemacht haben, sehen Sie "bash".
Steve Folly