Bash

Aus Doku-Wiki
Zur Navigation springenZur Suche springen

Startscripte für Login- und Interaktive-Shell

  • Login-Shell
Distribution   anwenderspezifisch   systemweit
--------------------------------------------------------
Ubuntu 10.4    ~/.profile           /etc/profile.d/*.sh

RHEL 5         ~/.bash_profile      /etc/profile.d/*.sh

SLES 11        ~/.profile           /etc/profile.local

Debian         ~/.bash_profile      /etc/profile
  • interaktive Shell
Distribution   anwenderspezifisch   systemweit
--------------------------------------------------------
Ubuntu 10.4    ~/.bashrc           /etc/bash.bashrc

RHEL 5         ~/.bashrc           /etc/bashrc

SLES 11        ~/.bashrc           /etc/bash.bashrc

Debian         ~/.bashrc           /etc/bash.bashrc

USB Tastatur und USB Maus deaktivieren

  • deaktiviert USB Maus und Tastatur
rmmod usbhid
  • aktiviert USB Maus und Tastatur wieder
modprobe usbhid

Tastaturlayout ändern

dpkg-reconfigure locales
dpkg-reconfigure console-data
dpkg-reconfigure console-common
dpkg-reconfigure console-tools

Erneutes Anmelden und die locales + keymap sollten jetzt laufen

Fortschrittsanzeige

echo

  • echo ohne Zeilenumbruch
echo -n "TEXT"

bar

Dieses Shellscript erzeugt einen Fortschrittsbalken

Shell

Info´s

man test

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

Array zuweisen

meinarray=("1" "2" "3" "test")
meinarray=(1 2 3 test)
meinarray[0]=1
meinarray[1]=2
meinarray[2]=3
meinarray[3]=test 

echo ${meinarray[0]}
echo ${meinarray[1]}

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

Kommentar Zeilen entfernen

  • Hier werden alle Kommentar Zeilen entfernt die mit einem # beginnen
grep -v ^# [DATEINAME]
  • Hier werden alle Komentarzeilen, auch eingerückte Kommentar Zeilen entfernt
grep -v "^[[:space:]]*#"
  • Hier werden alle Komentarzeilen, auch eingerückte Kommentar Zeilen und Leerzeilen entfernt
grep -v "^[[:space:]]*#" | grep -v ^$
  • Hier werden Leerzeilen entfernt
grep -v ^$

Nach mehreren Worten suchen

# grep 'wort1\|wort2' *.doc
# grep -i -l -E "(wort1|wort2)" *.doc
# egrep -l -i "(wort1|wort2)" *.doc

Nach Zahlen suchen

#    grep '[0-9]\{4\}'
#            1-9 4x
# Beispile    3564
  • Ausführliche Dokus:

grep Tutorial
linuxseiten.kg-it.de

Diff

Verzeichnisinhalte vergleichen

diff -rq VERZEICHNIS_1 VERZEICHNIS_2
diff -rq VERZEICHNIS_1 VERZEICHNIS_2 > unterschiede.txt 2>&1

Webserver mit der Bash erzeugen

Der Entwickler Răzvan Tudorică beschreibt in seinem Blog, wie man einen Webserver auf einem Linux-System mittels einer einzigen Bash-Zeile implementiert. Tudorică kommt mit den Befehlen echo, cat und netcat aus, die er in einer while-Schleife einbaut:

while true; do { echo -e 'HTTP/1.1 200 OK\r\n'; cat Dateiname; } | nc -l 8080; done

Von Rechner B ruft man den Webserver nach dem Muster http://IP-Adresse:8080 auf; also etwa http://192.168.112.36:8080, wenn das die IP-Adresse von Rechner A ist; der Browser erhält nun den Inhalt der Datei, die in dem Bash-Einzeiler genannt ist. Beim Speichern aus dem Browser muss man einen lokalen Dateinamen wählen, denn der Webserver liefert nur den Dateiinhalt ohne weitere Angaben. Auf Rechner A kann man in der Shell wunderbar die Anfrage des Browsers mitlesen.