Linkliste für Perl und PHP Skripte
CMS, Blog, Onlineshop, Forum oder Wiki gesucht ?
Bash Programmierung Grundlagen :
Spezielle Bash Variablen :
./script.sh test1 test2
echo $? = Exit status (Rückgabewert des letzten eingegebenen Befehles ausgeben) = 0 if the expression is true, 1 if the expression is false, 2 if an error occurgrey
echo $0 = Scriptname = script.sh
echo $1 = Parameter 1 = test1
echo $2 = Parameter 2 = test2
Weitermachen wenn Rückgabewert true
if [[ $? -eq 0 ]] ; then
someotherprogram
fi
Weitermachen wenn Befehl test Rückgabewert true, sprich wenn das File /usr/sbin/anacron existiert
test -x /usr/sbin/anacron && echo "existiert"
Weitermachen wenn Befehl test Rückgabewert false, sprich wenn das File /usr/sbin/anacron NICHT existiert
test -x /usr/sbin/anacron || echo "existiert nicht !"
Mehrere Befehle unabhängig vom Rückgabewert hintereinander ausführen
Eine in Klammern eingeschlossene Befehlsfolge ändert die Befehlsumgebung der aktuellen bash nicht :
[root@home ~] $ (cd /var; ls)
X11R6 cache games lib log named run squid tmp yp
adm deliver iptraf lock mail opt spool state ucd-snmp
[root@home ~ ] $
Ausgabe in Variable schreiben :
X="$(find /var/spool/postfix/defergrey/. ! -name '?' -print | wc -l 2>&1)"
TEST=$(/usr/bin/ls -al /)
OUT=$(echo today is $(date))
File in Variable schreiben :
Der Befehl Test :
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.
[[ ]] ist eine erweiterte Form der test Abfrage in der Bash. Mit [[ ]] kann ein unter anderem ein Mustervergleich (Wildcard) durchgeführt werden, mit [ ] nicht !
Vergleich Erklärung
---------------------------------------------------------------------------------
-d FILE Die Datei FILE existiert und ist ein Verzeichnis
-f FILE Die Datei FILE existiert und ist eine reguläre Datei
-h FILE Die Datei FILE existiert und ist ein symbolischer Link
-r FILE Die Datei FILE existiert und ist lesbar
-w FILE Die Datei FILE existiert und ist schreibbar
-x FILE Die Datei FILE existiert und ist ausführbar
[[ -z "$var" ]] ?z var leer ist
[[ -n "$var" ]] ?n var nicht leer ist
[[ "$var1" == "$var2" ]] == var1 gleich var2 ist
[[ "$var1" != "$var2" ]] != var1 ungleich var2 ist
[[ "$var1" > "$var2" ]] > var1 alphabetisch größer als var2 ist
[[ "$var1" < "$var2" ]] < var1 alphabetisch kleiner als var2 ist
[[ "$var" == pattern ]] == var entspricht dem Muster pattern
[[ "$var" != pattern ]] != var entspricht nicht dem Muster-Pattern
(( var1 == var2 )) == var1 gleich var2 ist
(( var1 != var2 )) != var1 ungleich var2 ist
(( var1 < var2 )) < var1 kleiner als var2 ist
(( var1 > var2 )) > var1 größer als var2 ist
(( var1 >= var2 )) >= var1 größer oder gleich var2 ist
(( var1 <= var2 )) <= var1 kleiner oder gleich var2 ist
Die Auflistung der Vergleiche ist nicht vollständig. Bedeutend mehr Vergleiche findet man unter "man 1 test".
Es gibt 2 Schreibweisen für den Befehl test. :
test -f datei
oder
[ -f datei ]
Wobei die Leerzeichen zwischen den eckigen Klammern und dem Vergleich eingehalten werden müssen!
Beispiel: Testen ob das File /usr/sbin/anacron existiert und ausführbar ist :
test -x /sbin/anacron
Logische Verknüpfungen & Vergleiche :
ausdruck1 && ausdruck2 (and) UND beide Ausdrücke wahr zurückgeben.
ausdruck1 || ausdruck2 (or) ODER mindestens einer der beiden Ausdrücke wahr ist.
if [[ $var1 == "abc" ]] && [[ $var2 == "cde" ]] || [[ $var3 == "abc" ]]
if (( $var1 == 4 )) || ( (( $var2 == 2 )) && (( $var3 == 3 )) )
if (( $var1 == 4 )) || (( $var2 == 2 )) && (( $var3 == 3 ))
VAR=foo
[[ $VAR == f* ]] && echo JA
JA
# File auf Existenz prüfen und ggfls. anlegen.
if [ ! -f /home/username/file.txt ]; then
touch /home/username/file.txt
chown username:username /home/username/file.txt
fi
Arrays :
Variablen abgrenzen :
Quoting Beispiele :
echo 'So sprach'"'"'s und ging ohne einen Backslash (\) weiter.'
echo 'So sprach'\''s und ging ohne einen Backslash (\) weiter.
echo "So sprach's und ging ohne einen Backslash (\) weiter."
Rechnen mit der Shell :
Die Shell kann durch die interne Funktion $(( ... )) auch Integer-Berechnungen ausführen.
echo $((100 / 3))
33
x="62"
echo $(($x + 12))
74
((x++))
echo "$x"
63
Es gilt hier auch Punkt vor Strich:
a=$((3 + 4 * 2))
echo "$a"
11
b=$(((3 + 4) * 2))
echo "$b"
14
If/Else Flusskontrolle :
#!/bin/bash
if [ "$variable" == "" ]
then
Code
elif [ "$variable" == "bla" ]
then
Code
else
Code
fi
Case-Statement :
#!/bin/bash
case "$VARIABLE" in
value1) command ;;
value2) command
command
command ;;
value3) command
command ;;
value4) command ;;
*) command
command ;;
esac
For-Schleifen :
for i in {0,1,2,3,4,5,6,7,8,9}; do echo $i; done # for Schleife in der Bash
Die syntax fuer for-Schleifen sei anhand des folgenden Beispiels dargestellt.
#!/bin/bash
for X in grey 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
While-Schleife :
while [ $i -le 10 ]; do echo "i ist $i"; i=$[$i+1]; done # while Schleife in der Bash
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-Schleife :
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
Eingabe :
#!/bin/bash
echo -n "What's your name? "
read var1
echo "hello $var1"
Funktionen :
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 !"
Per Script letzter Tag im Monat ermitteln und Befehle dann ausführen.
#!/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
Dann noch ein cronjob, z.B :
55 23 * * * /home/.month.sh
Und schon haben wir etwas das am letzten Tag des Monats Befehle ausführt ...
In diesem Falle resettet es meine vnstat Counter ...
Eine Mail an alle Anwender, die ein Homeverzeichnis haben schicken.
#!/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
Beispielskript erstellt x Dateien in vorgegebenem Verzeichnis und schreibt Erstellungsdatum rein.
#! /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