Gerne
Also, lassen wir iptables dafür aber noch beiseite, den meine "working Examples" in der .profile habe nur mit den fünf LEDs der Fritz!Box zu tun.
Zuerst mal meine .profile:
(Achtung:
usleep wird benutzt, kein Standardbefehl, muss busybox draufhaben (make menuconfig dann bei busybox in den coreutils, oder statische busybox mit usleep))
usleep kann aber durch sleep ersetzt werden, doch müssem dann alle ###second/s auf 1 gesetzt werden!
PHP:
#! /bin/sh
# die fritzbox LED's:
if [ $# -gt 0 ]
then
# Argument wurde uebergeben
# usleep konfigurieren
ksleep=/bin/usleep
octasecond=125000
quartersecond=250000
halfsecond=500000
second=1000000
fiveseconds=5000000
# Das Lauflicht vorbereiten...
leftright () { #von links nach rechts
echo "SET power,0 = 1" > /dev/new_led
$ksleep $octasecond
echo "SET power,0 = 0" > /dev/new_led
echo "SET internet,0 = 1" > /dev/new_led
$ksleep $octasecond
echo "SET internet,0 = 0" > /dev/new_led
echo "SET ab,1 = 1" > /dev/new_led
$ksleep $octasecond
echo "SET ab,1 = 0" > /dev/new_led
echo "SET wlan,0 = 1" > /dev/new_led
$ksleep $octasecond
echo "SET wlan,0 = 0" > /dev/new_led
echo "SET info,0 = 1" > /dev/new_led
$ksleep $octasecond
echo "SET info,0 = 0" > /dev/new_led
}
rightleft () { #von rechts nach links
echo "SET info,0 = 1" > /dev/new_led
$ksleep $octasecond
echo "SET info,0 = 0" > /dev/new_led
echo "SET wlan,0 = 1" > /dev/new_led
$ksleep $octasecond
echo "SET wlan,0 = 0" > /dev/new_led
echo "SET ab,1 = 1" > /dev/new_led
$ksleep $octasecond
echo "SET ab,1 = 0" > /dev/new_led
echo "SET internet,0 = 1" > /dev/new_led
$ksleep $octasecond
echo "SET internet,0 = 0" > /dev/new_led
echo "SET power,0 = 1" > /dev/new_led
$ksleep $octasecond
echo "SET power,0 = 0" > /dev/new_led
}
all_off () {
# Alle aus (auch der zus. power u. internet Slot):
echo "SET power,0 = 0" > /dev/new_led
echo "SET power,1 = 0" > /dev/new_led
echo "SET internet,0 = 0" > /dev/new_led
echo "SET internet,1 = 0" > /dev/new_led
echo "SET ab,1 = 0" > /dev/new_led
echo "SET ab,2 = 0" > /dev/new_led
echo "SET ab,3 = 0" > /dev/new_led
echo "SET wlan,0 = 0" > /dev/new_led
echo "SET info,0 = 0" > /dev/new_led
}
all_on () {
# Alle an:
echo "SET power,0 = 1" > /dev/new_led
echo "SET internet,0 = 1" > /dev/new_led
echo "SET ab,1 = 1" > /dev/new_led
echo "SET wlan,0 = 1" > /dev/new_led
echo "SET info,0 = 1" > /dev/new_led
}
all_slow () {
# Alle blinken langsamer:
echo "SET power,0 = 16" > /dev/new_led
echo "SET internet,0 = 16" > /dev/new_led
echo "SET ab,1 = 16" > /dev/new_led
echo "SET wlan,0 = 16" > /dev/new_led
echo "SET info,0 = 16" > /dev/new_led
}
all_med () {
# Alle blinken langsam:
echo "SET power,0 = 17" > /dev/new_led
echo "SET internet,0 = 17" > /dev/new_led
echo "SET ab,1 = 17" > /dev/new_led
echo "SET wlan,0 = 17" > /dev/new_led
echo "SET info,0 = 17" > /dev/new_led
}
all_fast () {
# Alle blinken schnell:
echo "SET power,0 = 18" > /dev/new_led
echo "SET internet,0 = 18" > /dev/new_led
echo "SET ab,1 = 18" > /dev/new_led
echo "SET wlan,0 = 18" > /dev/new_led
echo "SET info,0 = 18" > /dev/new_led
}
all_rapid () {
# Alle blinken ultraschnell:
echo "SET power,0 = 19" > /dev/new_led
echo "SET internet,0 = 19" > /dev/new_led
echo "SET ab,1 = 19" > /dev/new_led
echo "SET wlan,0 = 19" > /dev/new_led
echo "SET info,0 = 19" > /dev/new_led
}
if [ $1 = "off" ]
then
# Alle aus:
all_off
fi
if [ $1 = "on" ]
then
# Alle an:
all_on
fi
if [ $1 = "slow" ]
then
# Alle blinken langsamer:
all_slow
fi
if [ $1 = "med" ]
then
# Alle blinken langsam:
all_med
fi
if [ $1 = "fast" ]
then
# Alle blinken schnell:
all_fast
fi
if [ $1 = "rapid" ]
then
# Alle blinken ultraschnell:
all_rapid
fi
if [ $1 = "run" ]
then
# Lauflicht:
leftright
$ksleep $octasecond
rightleft
fi
if [ $1 = "test" ]
then
all_off
all_on
$ksleep $second
leftright
$ksleep $quartersecond
all_slow
$ksleep $fiveseconds
rightleft
$ksleep $quartersecond
all_med
$ksleep $fiveseconds
leftright
$ksleep $quartersecond
all_fast
$ksleep $fiveseconds
rightleft
$ksleep $quartersecond
all_rapid
$ksleep $fiveseconds
leftright
$ksleep $octasecond
rightleft
$ksleep $octasecond
leftright
$ksleep $octasecond
rightleft
$ksleep $octasecond
leftright
$ksleep $octasecond
rightleft
$ksleep $octasecond
leftright
$ksleep $octasecond
rightleft
$ksleep $octasecond
leftright
$ksleep $octasecond
rightleft
$ksleep $octasecond
leftright
$ksleep $octasecond
rightleft
$ksleep $octasecond
all_on
$ksleep $halfsecond
all_off
fi
if [ $1 = "help" ]
then
echo "help:"
echo " one of:"
echo "off on slow med fast rapid run test"
fi
fi
#EO leds
# ALIASES
alias l='ls -AFXhlp --color'
# farbiges Prompt
export PS1="\[\033[0;32m\]\u\[\033[1;34m\]@\[\033[0;32m\]\h\[\033[1;35m\]:\[\033[1;33m\]\w\[\033[0m\]\[\033[1;34m\]#\[\033[0m\] "
return 0
Hier sind, wie du siehst, eine ganze Menge Funktionen drin, alle haben folgendes gemeinsam:
In der .profile werden die Funktionen definiert, aber nicht ausgeführt <--- <<< WICHTIG
Eine Funktionsdefinition hat folgenden Aufbau: Funktions_Name () {...}
...zwischen den geschweiften Klammern steht der ausführbare Code.
Eine Funktion wird mit ihrem Namen aufgerufen und verhält sich dann genauso wie ein Skript oder Programm.
Wenn im ausführbaren Code Parameter ausgewertet werden, können der Funktion auch auswertbare Parameter übergeben werden.
Beispiel: Funktions_Name Parameter1 Parameter2 usw
In der runden Klammer kann ein oder mehrere Parameter als Variablenname stehn, die dann im Code nicht extra definiert werden müssen, sie können auch default Werte vorhalten.
Beispiel: Funktions_Name (para1=$LOGNAME) {...}
Wenn para1 ($1) dann übergeben worden ist, enthält er den übergebenen Wert, wenn nicht dann $LOGNAME.
So, das war die Theorie, weiter mit meiner .profile....
Die ist nämlich so geskriptet, dass sie Parameter auswertet, soll heissen, ich ruf .profile gefolgt von einem Textstring, das Skript wertet das dann aus und führt an richtiger Stelle den Code aus.
(nur dann, wenn ein Parameter übergeben wird, werden die Funktionen auch definiert, ist ein plumper Trick)
Bei mir findet sowas zB. in meiner crontab statt:
crontab
PHP:
* * * * * /bin/sh $HOME/.profile run
("run" Jede Minute wird ein Lauflicht von Links nach Rechts und wieder zurück auf meinen Fritz!Box LEDs flitzen, danach ist wieder 59 Sekunden Ruhe)
Logik im Skript:
1. Parameter bekommen.
2. Funktionsdefinitionen.
3. Parameterauswertung.
4. Parameter "run" bekannt, verzweige und führe weitergehenden Anweisungen aus.
5. Anweisungen mit Funktionsaufrufen werden ausgeführt.
6. Skript beendet sich.
Funktionen werden meistens für sich wiederholende Abläufe benötigt.
(Glaubst du nicht? Dann schau dir mal an was bei .profile test ausgeführt wird

)
Im Prinzip sind definierte Funktionen als "Skript im Skript" zu sehen, lassen sich inkludieren (in einem Skript nachladen) oder werden eben im aktuellen Skript am Anfang definiert, damit man sie am Ende (nach ihrer Definition) schon benutzen kann.
Ich hab schon Definitionen von Funktionen als
Umgebungsvariablen gesehn und selbst ein
alias lässt sich so
frisieren 