
Der Befehl test dient zum Überprüfen von Dateitypen bzw. Vorhandensein von Dateien und zum Vergleichen von Werten. Der Aufruf erfolgt mit test Vergleich wobei Vergleich die Prüfung bzw. den Vergleich enthält. Als Ergebnis gibt test 0 für Wahr (true) und 1 für Falsch (false) zurück. Der Rückgabewert wird mit Hilfe der Shelleigenen Variablen $? ermittelt. Es gibt Vergleiche für Dateien (file), Zeichenketten (string) und Integer-Zahlen (integer). Integer-Zahlen sind ganze Zahlen, also ohne Nachkommastellen! Vergleich Erklärung --------------------------------------------------------------------------------- STRING1 == STRING2 string1 und string2 sind gleich STRING1 != STRING2 string1 und string2 sind nicht gleich INTEGER1 -eq INTEGER2 Integer-Zahl1 ist gleich wie Integer-Zahl2 INTEGER1 -ne INTEGER2 Integer-Zahl1 ist ungleich wie Integer-Zahl2 INTEGER1 -gt INTEGER2 Integer-Zahl1 ist grösser als Integer-Zahl2 INTEGER1 -ge INTEGER2 Integer-Zahl1 ist größer gleich Integer-Zahl2 INTEGER1 -lt INTEGER2 Integer-Zahl1 ist kleiner als Integer-Zahl2 INTEGER1 -le INTEGER2 Integer-Zahl1 ist kleiner gleich Integer-Zahl2 -d FILE Die Datei FILE existiert und ist ein Verzeichnis -f FILE Die Datei FILE existiert und ist eine reguläre Datei Die Auflistung der Vergleiche ist nicht vollständig. Bedeutend mehr Vergleiche findet man unter "man 1 test". Logische Verknüpfungen Man kann mehrere Vergleiche mit logischem UND (AND) oder logischem ODER (OR) verknüpfen. Für die UND-Verknüpfung verbindet man die Vergleiche mit -a für die ODER-Verknüpfung mit -o. Vergleich1 -a Vergleich2 -a .... -a VergleichN UND-Verknüpfung Vergleich1 -o Vergleich2 -o .... -o VergleichN ODER-Verknüpfung Bei der UND-Verknüpfung müssen alle Vergleiche WAHR sein, also den Wert 0 zurückgeben,damit der gesamte Ausdruck WAHR ist. Bei der ODER-Verknüpfung muss einer der Vergleiche WAHR (TRUE) sein, damit der gesamte Ausdruck WAHR ist. Es gibt 2 Schreibweisen für den Befehl test. Die erste : test vergleich Die zweite : [ vergleich ] Wobei die Leerzeichen zwischen den eckigen Klammern und dem Vergleich eingehalten werden müssen! |
#!/bin/bash if [ $variable == "" ] then Code elif [ $variable == "1" ] then Code else Code fi |
#!/bin/bash
case "$VARIABLE" in
value1) command ;;
value2) command
command
command ;;
value3) command
command ;;
value4) command ;;
*) command
command ;;
esac
|
Die syntax fuer for-Schleifen sei anhand des folgenden Beispiels dargestellt.
#!/bin/bash
for X in red green blue
do
echo $X
done
Zu beachten ist, dass Zeichenketten ggf. mittels Quotes (Gaensefuesschen) umschlossen werden
muessen. Des weiteren gelten hier auch alle anderen Moeglichkeiten um Listen zu generieren
(*-Wildcard, etc.).
# Diese Schleife beginnt mit einem Wert von 1 und
# läuft in mit einer Schrittgrösse von 1 aufwärts
# bis zur 5. Der Schleifenzähler wird dann mit
# echo am Bildschirm ausgegeben.
#!/bin/bash
for (( I=1; $I <= 5; I++ ))
do
echo $I
done
|
Solange eine Bedingung erfuellt ist, wird die Kommandos in der While-Schleifen ausgefuehrt.
#!/bin/bash
X=0
while [ $X -le 20 ]
do
echo $X
X=$((X+1))
done
|
until führt eine Schleife solange aus wie eine Bedingung nicht erfüllt ist. Der Unterschied zur while Schleife besteht damit in der logisch negierten Form der Bedingung. Syntax: until Bedingung do Kommandoliste done |
Wie in den meisten Programmiersprachen ist es auch in bash moeglich Funktionen zu deklarieren
und auf diesem Wege Quellcode logisch zu gruppieren.
#!/bin/bash
function myfunc {
echo "Hallo Welt !"
}
myfunc
Eine Funktion mit Parametern sieht wie folgt aus:
#!/bin/bash
function myfunc {
echo $1 $2
}
myfunc Hallo "Welt !"
|
#!/bin/sh # Script lastday.sh # letzter Tag im Monat ermitteln und Befehle dann ausführen TODAY=`date +%d` TOMORROW=`date +%d -d "1 day"` TIME=`date +%H%M` # See if tomorrow's day is less than today's if [ $TOMORROW -lt $TODAY ]; then echo "Letzter Tag im Monat !" if [ $TIME -ge 2350 ]; then echo "$TIME ist größer als 2350" echo "Führe Befehle aus !" rm /var/lib/vnstat/eth0 vnstat -u -i eth0 fi else if [ $TIME -ge 2350 ]; then echo "$TIME ist größer als 2350" echo "aber nicht letzter Tag im Monat. Führe keine Befehle aus !" else if [ $TIME -le 2350 ]; then echo "$TIME ist kleiner als 2350" echo "und es nicht letzter Tag im Monat. Führe keine Befehle aus !" fi fi fi |
#!/bin/bash # Script mail2all # schickt eine Mail an alle Anwender, die ein Homeverzeichnis haben if ! test $1 ; then echo " " echo "Aufruf: mail2all [Betreff - nur ein Wort!] [Dateiname-der-Nachricht]" echo "oder : mail2all [Dateiname-der-Nachricht]" echo " " exit 1 elif ! test -e $2 ; then echo " " echo "Die Datei $2, die Sie als Mail verschicken wollen, gibt es nicht!" echo " " exit 1 else if ! test $2 ; then echo " " for i in `cat /etc/passwd | cut -d: -f1` do if test -d /home/$i ; then /usr/bin/mail $i < $1 echo "Mail mit dem Inhalt von $1 an $i abgeschickt" fi done echo " " else echo " " for i in `cat /etc/passwd | cut -d: -f1` do if test -d /home/$i ; then /usr/bin/mail -s $1 $i < $2 echo "Mail mit Betreff $1 und dem Inhalt von $2 an $i abgeschickt" fi done echo " " fi fi exit 0 |
#! /bin/bash
# Variablen anlegen zu besseren Arbeiten!
DS=Datensicherung
Datum=$(date +%H:%M)
# Abfrage ob Verzeichniss vorhanden, wenn nein, dann neu anlegen.
if [ ! -d $DS ]
then
echo "Ich lege Verzeichnis $DS an."
mkdir /mnt/$DS
# Wenn ja, dann Meldung und weiter!
else
echo "Verzeichnis $DS schon vorhanden"
fi
# Hier wird Diskette gemountet, dann werden die Dateien in das oben
# angelegte Verzeichniss kopiert.
# Danach Ausgabe, wieviel Dateien, wieviele Wörter und wieviele
# Buchstaben vorhanden sind!
mount /dev/sdb /mnt/disk
rm -Rf /mnt/$DS/*
cp /mnt/disk/* /mnt/$DS
files=`ls /mnt/$DS | wc -w`
echo "Es sind $files Dateien vorhanden!"
cat /mnt/$DS/* > /mnt/$DS/alles.txt
woerter=`cat /mnt/$DS/alles.txt | wc -w`
buchstaben=`cat /mnt/$DS/alles.txt | wc -c`
rm -Rf /mnt/$DS
echo "Es sind $woerter Wörter in allen Dateien vorhanden!"
echo "Es sind $buchstaben Buchstaben in allen Dateien vorhanden!"
# Hier wird die Diskette formatiert und das Skript darauf kopiert.
umount /mnt/disk
mkfs.ext2 -F -q /dev/sdb
mount /dev/sdb /mnt/disk
cp /mnt/skript1.sh /mnt/disk
chmod o+x /mnt/disk/skript1.sh
rm -Rf /mnt/disk/lost+found
umount /mnt/disk
echo "Ich habe fertig!!!"
|
#! /bin/bash
DIR=/mnt/test
# Abfrage ob Verzeichniss vorhanden, wenn nein, dann neu anlegen.
if [ ! -d $DIR ]
then
mkdir /mnt/DIR
fi
erzeuge (){
touch $DIR/Datei$1
date > $DIR/Datei$1
}
echo -n "Wieviel Dateien wollen sie erstellen : "
# Bildschirmeingabe von Variable x
read x
i=0
while [ $x != $i ]; do
i=$(( $i + 1 ))
erzeuge $i
done
|
#! /bin/bash
# Kiste runterfahren bzw rebooten per Menü
# Copyright http://www.staschke.de
if test $UID -ne 0; then
exec sudo $0 $*
fi
DIALOG=${DIALOG=/usr/bin/dialog}
$DIALOG --clear --title "SHUTDOWN MENUE BOX" \
--menu "\n\
Bitte auswaehlen \n\
Navigation mit UP/DOWN Tasten, oder den \n\
ersten Buchstaben druecken (Hotkey), oder mit \n\
den Zifferntasten 1-3 eine Auswahl treffen. \n\
Try it now!\n\
" 18 50 3 \
"Aus" "Linux runterfahren" \
"Reboot" "Linux neu starten" \
"Cancel" "Menue abbrechen" 2> /tmp/menu.tmp.$$
retval=$?
choice=`cat /tmp/menu.tmp.$$`
rm -f /tmp/menu.tmp.$$
setterm -clear
case $retval in
1)
echo "Cancel pressed.";;
255)
echo "ESC pressed.";;
esac
if [ "$choice" = "Aus" ]; then /sbin/shutdown -h now
exit 1
elif [ "$choice" = "Reboot" ]; then /sbin/shutdown -r now
exit 1
elif [ "$choice" = "Cancel" ]; then echo "Vorgang abgebrochen."
exit 1
fi
exit 0
|
#!/bin/bash A=`ls -l /home/username/updates.txt | tr -s " " | cut -d " " -f 5` if [ $A -gt 200 ] ; then cat /home/username/updates.txt | mutt -s "Updates wurden installiert !" mich@domain.de fi |