Hi, alle zusammen!
In Vorbereitung meiner Prüfung hab' ich mich in den letzten Tagen auf vielfaches Anraten einzelner Personen (*pfiffel*) mal etwas intensiver mit der Shell-Programmierung beschäftigt.
Was dabei rausgekommen ist, seht Ihr beigefügt ('laufschrift')...
Eines vorneweg: Das Teil erhebt weder den Anspruch besonders schön, noch fehlerfrei und vollständig zu sein - dafür dürft Ihr es beliebig verwenden und/oder verbessern/modifizieren; wozu auch immer! ;-) Sollte jemand eine ernsthafte Anwendung dafür finden, stehe ich für den Spendenempfang natürlich jederzeit unbürokratisch zur Verfügung...
Das Script lässt einen als Parameter übergebenen Text über die Mitte des aktuellen Terminalfensters scrollen. Das funktioniert im Prinzip alles so, wie ich mir das vorgestellt hab' (keine Ahnung, wozu man sowas in der Praxis braucht! *feix*).
ABER: Eines habe ich nicht hinbekommen und muss VOR dem 1. Start in jedem neuen Terminalfenster einmalig manuell durchgeführt werden:
export COLUMNS LINES
Das sorgt dafür, dass die BASH die Variablen für Fensterhöhe und -breite übermittelt bekommt. Wurde der Befehl einmal eingegeben, kann das Fenster vor jedem Neustart des Scripts beliebig in der Größe verändert werden - der Text wird immer in der Mitte erscheinen!!!
Und nun warte ich auf jemanden von Euch, der mir sagt, wie ich das auch noch automatisieren kann...! Ich hab's mit unzähligen Versuchen und Googlen NICHT hinbekommen... *schnief*
Trotzdem viel Spaß beim "rumspielen". Das Script ist hinreichend kommentiert und sollte von daher keine Fragen aufwerfen.
CU Stefan
#!/bin/bash # # laufschrift v1.0 # # Script, das einen einzugebenden Text in der gewünschten Richtung und Geschwindigkeit in der Mitte des # Terminalfensters vorbeiscrollt # # geschrieben von Stefan Schmitt am 11.03.2007 # # ...und hiermit feierlich unter die GPL gestellt! ;-) # # leerzeilen () # Funktion "n Leerzeilen ausgeben" { for i in `seq 1 $1`; do echo; done }
zeige_hilfe () { # Funktion "Hilfe-Seite anzeigen" clear echo echo "Benutzung des Scripts 'laufschrift':" echo "====================================" echo echo "laufschrift {Anzahl der Durchläufe} {Geschwindigkeit} {Richtung} {anzuzeigender Text}" leerzeilen 2 echo "Dabei gilt:" echo "-----------" echo "{Anzahl der Durchläufe} : Zahl zwischen 1 und 5" echo "{Geschwindigkeit} : Zahl zwischen 1 (langsam) und 5 (schnell)" echo "{Richtung} : l = Text scrollt von links nach rechts" echo " r = Text scrollt von rechts nach links" echo "{anzuzeigender Text} : Text, der in der Bildschirmmitte durchläuft" leerzeilen 5 exit 1 }
if [ $# -lt 4 ]; then zeige_hilfe; fi # Abfrage, ob Anzahl Start-Parameter richtig if [ $1 -lt 1 ]; then zeige_hilfe; fi # Tests, ob {Anzahl} in erlaubtem Rahmen if [ $1 -gt 5 ]; then zeige_hilfe; fi case $2 in # Scrollgeschwindigkeit festlegen 1) pause=0.12;; 2) pause=0.09;; 3) pause=0.06;; 4) pause=0.03;; 5) pause=0;; *) zeige_hilfe;; esac case $3 in # Scrollrichtung festlegen l|L) richtung=l;; r|R) richtung=r;; *) zeige_hilfe;; esac clear anzahl=$1 # Aufruf-Parameter auslesen und setzen shift;shift;shift # Anzahl/Tempo/Richtung überspringen => Zeilenrest ist Text! text=$* # Scrolltext ermitteln textlaenge=${#text} # Textlänge ermitteln breite=$COLUMNS # Terminalbreite ermitteln hoehe=$LINES # Terminalhöhe ermitteln zeilen=`expr $hoehe / 2` # vertikale Bildschirmmitte ermitteln leerzeilen `expr $zeilen - 1` # zur vertikalen Bildschirmmitte springen versatz=`expr $breite - $textlaenge - 1` # Anzahl Füllzeichen pro Zeile ermitteln for i in `seq 1 $anzahl`; # Schleife für 'Anzahl' Durchläufe do case $richtung in l) for j in `seq 1 $versatz`; # Schleife für Bildschirmbreite do for k in `seq 1 $j`;do echo -n " ";done # Schleife zur Textausgabe l -> r echo -n $text sleep $pause echo -ne \r; done;; r) for j in `seq $versatz -1 1`; # Schleife für Bildschirmbreite do for k in `seq 1 $j`;do echo -n " ";done # Schleife zur Textausgabe r -> l echo -n $text rest=`expr $breite - $j - $textlaenge - 1` for k in `seq 0 $rest`;do echo -n " ";done sleep $pause echo -ne \r; done;; esac done leerzeilen `expr $zeilen - 2` exit 0
Stefan Schmitt st.schmitt@online.de (Di 13 Mär 2007 08:59:36 CET):
Hi, alle zusammen!
fehlerfrei und vollständig zu sein - dafür dürft Ihr es beliebig verwenden und/oder verbessern/modifizieren; wozu auch immer! ;-) Sollte jemand eine ernsthafte Anwendung dafür finden, stehe ich für den Spendenempfang natürlich jederzeit unbürokratisch zur Verfügung...
... die Spenden willst Du dann sicher großzügig an die Unterstützer des Projekts weiterleiten :)
ABER: Eines habe ich nicht hinbekommen und muss VOR dem 1. Start in jedem neuen Terminalfenster einmalig manuell durchgeführt werden:
export COLUMNS LINES
Im Script: COLUMNS=$(tput cols) LINES=$(tput lines)
#!/bin/bash
Da es für die Bash ist, mal ein paar kleine Änderungsanregungen:
for i in `seq 1 $1`; do echo; done
for i in $(seq 1 $1); do echo; done
echo "Dabei gilt:" echo "-----------" echo "{Anzahl der Durchl??ufe} : Zahl zwischen 1 und 5" echo "{Geschwindigkeit} : Zahl zwischen 1 (langsam) und 5 (schnell)" echo "{Richtung} : l = Text scrollt von links nach rechts" echo " r = Text scrollt von rechts nach links" echo "{anzuzeigender Text} : Text, der in der Bildschirmmitte durchl??uft" leerzeilen 5 exit 1
Besser:
cat <<-EOT Benutzung .. .. .. EOT
anzahl=$1 # Aufruf-Parameter auslesen und setzen shift;shift;shift # Anzahl/Tempo/Richtung ??berspringen => Zeilenrest ist Text!
shift 3
zeilen=`expr $hoehe / 2` # vertikale Bildschirmmitte ermitteln
zeilen=$(( hoehe / 2 ))
Hallo Stefan,
On Tue, Mar 13, 2007 at 08:59:36 +0100, Stefan Schmitt wrote:
ABER: Eines habe ich nicht hinbekommen und muss VOR dem 1. Start in jedem neuen Terminalfenster einmalig manuell durchgefuehrt werden:
export COLUMNS LINES
Ich wuerde mich nicht auf diese Variablen verlassen. Frage besser mit tput das Terminal ab:
breite=$(tput cols) hoehe=$(tput lines)
Gruss, Chris
lug-dd@mailman.schlittermann.de