Bash: Unterschied zwischen den Versionen
Uli (Diskussion | Beiträge) (→if) |
Uli (Diskussion | Beiträge) |
||
Zeile 136: | Zeile 136: | ||
===Beispiel=== | ===Beispiel=== | ||
− | #!/bin/sh | + | #!/bin/sh |
− | # Interaktive Eingabe, Mehrfachentscheidung (case) | + | # Interaktive Eingabe, Mehrfachentscheidung (case) |
− | echo Alles in Ordnung? | + | echo Alles in Ordnung? |
− | echo Ihre Antwort: | + | echo Ihre Antwort: |
− | read answer | + | read answer |
− | echo Ihre Antwort war: $answer | + | echo Ihre Antwort war: $answer |
− | case $answer in | + | case $answer in |
− | + | j*|J*|y*|Y*) echo jawohl ;; | |
− | + | n*|N*) echo nein, ueberhaupt nicht! ;; | |
− | + | *) echo das war wohl nichts ;; | |
− | esac | + | esac |
==Schleife: for== | ==Schleife: for== |
Version vom 22. Januar 2010, 10:55 Uhr
Inhaltsverzeichnis
Shell
Mehr infos
- man testa
Tests
sh -n myscript
Syntax-Test (die Kommandos werden gelesen und geprüft, aber nicht ausgeführt)
sh -v myscript
Ausgabe der Shell-Kommandos in der gelesenen Form
sh -x myscript
Ausgabe der Shell-Kommandos nach Durchführung aller Ersetzungen, also in der Form, wie sie ausgeführt werden
Shell Variablen
- $0
Name der Kommandoprozedur, die gerade ausgeführt wird
- $#
Anzahl der Parameter
- $1 $2 $3 ...
erster, zweiter, dritter ... Parameter
- $*
steht für alle Kommandozeilen-Parameter ($1 $2 $3 ...)
- $@
wie $* ($1 $2 $3 ...)
- "$@"
expandiert (im Unterschied zu "$*") zu: "$1" "$2" "$3" ...
- $$
Prozeßnummer der Shell (nützlich, um eindeutige Namen für temporäre Dateien zu vergeben)
- $-
steht für die aktuellen Shell-Optionen
- $?
gibt den Return-Code des zuletzt ausgeführten Kommandos an (0 bei erfolgreicher Ausführung)
- $!
Prozeßnummer des zuletzt ausgeführten Hintergrund-Prozesses
- $VAR
Variable mit dem Namen VAR. Das kann entweder eine Umgebungsvariable, wie $USER, sein oder eine die "lokal" im Skript definiert wurde
Beispiel:
#!/bin/sh # Variablen echo Uebergabeparameter: $* echo user ist: $USER echo shell ist: $SHELL echo Parameter 1 ist: $1 echo Prozedurname ist: $0 echo Prozessnummer ist: $$ echo Anzahl der Parameter ist: $# a=17.89 # ohne Luecken am = Zeichen echo a ist $a
Vergleichsoperationen
Hinweis: Es ist unbedingt notwendig, daß alle Operatoren von Leerzeichen umgeben sind, sonst werden sie von der Shell nicht erkannt! (Das gilt auch für die Klammern.)
Zeichenketten
"s1" = "s2" wahr, wenn die Zeichenketten gleich sind "s1" != "s2" wahr, wenn die Zeichenketten ungleich sind -z "s1" wahr, wenn die Zeichenkette leer ist (Länge gleich Null) -n "s1" wahr, wenn die Zeichenkette nicht leer ist (Länge größer als Null)
(Ganze) Zahlen
n1 -eq n2 wahr, wenn die Zahlen gleich sind n1 -ne n2 wahr, wenn die Zahlen ungleich sind n1 -gt n2 wahr, wenn die Zahl n1 größer ist als n2 n1 -ge n2 wahr, wenn die Zahl n1 größer oder gleich n2 ist n1 -lt n2 wahr, wenn die Zahl n1 kleiner ist als n2 n1 -le n2 wahr, wenn die Zahl n1 kleiner oder gleich n2 ist
Sonstiges
! Negation -a logisches "und" -o logisches "oder" (nichtexklusiv; -a hat eine höhere Priorität) \( ... \) Runde Klammern dienen zur Gruppierung. Man beachte, daß sie durch einen vorangestellten Backslash, \, geschützt werden müssen. -f filename -d Verzeichnis wahr, wenn die Datei/Verzeichnis existiert.
- (Weitere Optionen findet man in der man page zu test
Prozeßsteuerung
if
if [ bedingung ] then kommandos1 else kommandos2 fi
Anmerkungen: "fi" ist ein rückwärts geschriebenes "if", es bedeutet "end if" (diese Schreibweise ist eine besondere Eigenheit der Bourne Shell). Die "bedingung" entspricht der Syntax von test. Im if-Konstrukt kann der "else"-Zweig entfallen, andererseits ist eine Erweiterung durch einen oder mehrere "else if"-Zweige möglich, die hier "elif" heißen:
if [ bedingung1 ] then kommandos1 elif [ bedingung2 ] then kommandos2 else kommandos3 fi
Die Formulierung
if [ bedingung ]
ist äquivalent zu
if test bedingung
Alternativ ist es möglich, den Erfolg eines Kommandos zu prüfen:
if kommando (beispielsweise liefert das Kommando "true" stets "wahr", das Kommando "false" hingegen "unwahr")
- Beispiel
#!/bin/sh # Interaktive Eingabe, if-Abfrage echo Hallo, user, alles in Ordnung? echo Ihre Antwort, n/j: read answer echo Ihre Antwort war: $answer # if [ "$answer" = "j" ] if [ "$answer" != "n" ] then echo ja else echo nein fi
Mehrfachentscheidung: case
case var in muster1) kommandos1 ;; muster2) kommandos2 ;; *) default-kommandos ;; esac
Beispiel
#!/bin/sh # Interaktive Eingabe, Mehrfachentscheidung (case) echo Alles in Ordnung? echo Ihre Antwort: read answer echo Ihre Antwort war: $answer case $answer in j*|J*|y*|Y*) echo jawohl ;; n*|N*) echo nein, ueberhaupt nicht! ;; *) echo das war wohl nichts ;; esac
Schleife: for
for i in par1 par2 par3 ... do kommandos done
Anmerkungen: Die for-Schleife in der Bourne Shell unterscheidet sich von der for-Schleife in üblichen Programmiersprachen dadurch, daß nicht automatisch eine Laufzahl erzeugt wird. Der Schleifenvariablen werden sukzessive die Parameter zugewiesen, die hinter "in" stehen. (Die Angabe "for i in $*" kann durch "for i" abgekürzt werden.)
Beispiel:
#!/bin/sh # Schleifen: for echo Uebergabeparameter: $* # for i for i in $* do echo Hier steht: $i done
for i in `ls *zip`;do unzip $i;done;
for ((i=1; $i<=8; i++)); do `./li-www-template.sh make li-www- 172.27.5. 10$i`; done;
Schleife: while und until
while [ bedingung ] do kommandos done
until [ bedingung ] do kommandos done
Anmerkung: Bei "while" erfolgt die Prüfung der Bedingung vor der Abarbeitung der Schleife, bei "until" erst danach. (Anstelle von "[ bedingung ]" oder "test bedingung" kann allgemein ein Kommando stehen, dessen Return-Code geprüft wird; vgl. die Ausführungen zu "if".)
Beispiel:
#!/bin/sh # Schleifen: while # mit Erzeugung einer Laufzahl i=1 while [ $i -le 5 ] do echo $i i=`expr $i + 1` done
xargs
find . -name .svn -print0 | xargs -0 rm -rf
- Nun die Erklärung:
- Sucht nach Dateien mit dem namen ".svn"
find . -name .svn
- Gibt die Dateien in einer List aus
- Sind Leerzeichen im Namen wird find beauftragt, die Ergebnisse mit ASCII-NUL auszugeben
-print0
- und xargs, er möge solche erwarten
xargs -0 rm -rf
grep
- Nach mehreren Worten suchen
# grep 'wort1\|wort2' *.doc # grep -i -l -E "(wort1|wort2)" *.doc # egrep -l -i "(wort1|wort2)" *.doc
- Ausführlice Dokus: