Vordefinierte und spezielle Variablen, shift, set

Beim Starten einer Shell werden viele Variablen bereits vordefiniert, die großteils veränderbar sind (HOME, PATH usw.). Ein kleinerer Teil kann nicht geändert werden (PPID).

Weiterhin gibt es Variablen, die eigentlich gar keine sind, sondern bei ihrem Aufruf etwas erzeugen und zurückgeben.

Die wichtigsten im Überblick:
Ausdruck liefert:
$# Anzahl Argumente
$0 Name
$1...$9 Parameter, bash auch: ${1}...${9} und weitere
$* alle Parameter
"$*" alle Parameter als ein String
$@ alle Parameter
"$@" alle Parameter als je ein String
$$ process id
$? Rückgabewert/exit-Status des letzten Kommandos
${name-wert} Wenn name definiert ist, dann $name , sonst wert
${name=wert} Wenn name definiert ist, dann $name , sonst (name=wert)
${name+wert} Wenn name definiert ist, dann wert , sonst Nullwert
${name?} Wenn name definiert ist, dann $name , sonst (Abbruch)
${name?wert} Wenn name definiert ist, dann $name ,
sonst (Ausgabe von wert, Abbruch)
${name:-wert} Wenn name nicht Nullwert ist, d. $name , sonst wert
${name:=wert} Wenn name nicht Nullwert ist, d. $name , sonst (name=wert)
${name:+wert} Wenn name nicht Nullwert ist, d. wert , sonst Nullwert
${name:?} Wenn name nicht Nullwert ist, d. $name , sonst (Abbruch)
${name:?wert} Wenn name nicht Nullwert ist, d. $name ,
sonst (Ausgabe von wert, Abbruch)

Die Positionsparameter (1 etc., *, @) und die Anzahl (#) beziehen sich innerhalb einer Funktion auf die Parameter, mit denen die Funktion aufgerufen wurde (siehe Funktionen). Außerhalb von Funktionen beziehen sie sich auf die Parameter des Shellprogramms.



Die Variablen 1..., *, @, und # kann man mit dem Befehl shift beeinflussen. shift (ohne Argumente) verwirft den ersten Parameter $1 unwiderruflich, und rückt die anderen um eine Position auf. *, @, und # werden entsprechend angepaßt.
shift mit einer nachfolgenden Zahl verschiebt die Parameter analog dazu um mehrere Plätze.



Mit dem (internen) Kommando set kann man einerseits Optionen setzen, mit denen das Verhalten der Shell selbst beeinflußt wird. Beispielsweise kann man mit set -o vi bewirken, daß das Aufrufen und Ändern von alten Kommandos mit vi-Befehlen erfolgt (k für: eine Zeile aufwärts, j für: eine Zeile abwärts, h bzw. l für: Cursor nach links/rechts, i um etwas einzufügen, ...). Mit set -o emacs kann man wieder vernünftigerweise auf die Funktionen zurückschalten, wie man sie vom EMACS kennt.

Andererseits kann man mit set die Positionsparameter $1 etc. auf beliebige Werte setzen. Die davon abhängigen Variablen #, * und @ ändern sich dabei automatisch mit.

Beispiel 7   Setzen der Variablen 1, 2, und 3:
klaus@aw35:~ > set abc def ghi
klaus@aw35:~ > echo $2
def
klaus@aw35:~ > echo $#
3
klaus@aw35:~ > echo $*
abc def ghi

AnyWare@Wachtler.de