Bash: Unterschied zwischen den Versionen

Aus Doku-Wiki
Zur Navigation springenZur Suche springen
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 ;;
+
  j*|J*|y*|Y*) echo jawohl ;;
  n*|N*) echo nein, ueberhaupt nicht! ;;
+
  n*|N*) echo nein, ueberhaupt nicht! ;;
  *) echo das war wohl nichts ;;
+
  *) echo das war wohl nichts ;;
esac
+
esac
  
 
==Schleife: for==
 
==Schleife: for==

Version vom 22. Januar 2010, 10:55 Uhr

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
 -print
  • 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:

grep Tutorial
linuxseiten.kg-it.de