Linkliste für Perl und PHP Skripte 

PHP Archiv
Perl Scripts
Hotscripts (US)
Coder World



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

ls /home ; ls /var

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 :

X="$(cat /tmp/test.txt)"

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 :

... kommt noch ...

Variablen abgrenzen :

echo "${message}lolo"

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