Bash-Script Frage - read und leere Eingaben
Moinsen, ich hab hier ein kleines Script Problem und hoffe Ihr habt eine Idee: Ziel: es soll Interaktiv ein Text von stdin eingelesen werden, der Text soll entweder mit einem '.' in einer sonst leeren Zeile oder mit ctrl-d fertig sein (vgl. mail) z.zt. hab ich das so gelöst: readInteractive() { echo "Enter the Text (a single '.' or [CTRL-D] on a newline finishes):" while read in do if [[ $in = '.' ]] ; then break ; fi MSG=`echo -e "$MSG\n$in"` done } Problem: wenn ich leere zeilen eingeben will, verschwinden die :( read akzeptiert keine leeren Zeilen. Frage: womit kann ich read ersetzen, um auch leere Zeilen zu bekommen und dennoch die eingabe mit einem '.' abzubrechen? Als Alternative ist mir zwar cat gekommen, aber hier kann ich dann nur mit crtl-d abbrechen. Gruss Andreas
Hallo. Am Montag, den 27.12.2004, 12:23 +0100 schrieb Andreas Loesch:
ich hab hier ein kleines Script Problem und hoffe Ihr habt eine Idee:
Ziel: es soll Interaktiv ein Text von stdin eingelesen werden, der Text soll entweder mit einem '.' in einer sonst leeren Zeile oder mit ctrl-d fertig sein (vgl. mail)
z.zt. hab ich das so gelöst:
readInteractive() { echo "Enter the Text (a single '.' or [CTRL-D] on a newline finishes):" while read in do if [[ $in = '.' ]] ; then break ; fi MSG=`echo -e "$MSG\n$in"` done }
Problem: wenn ich leere zeilen eingeben will, verschwinden die :( read akzeptiert keine leeren Zeilen.
Frage: womit kann ich read ersetzen, um auch leere Zeilen zu bekommen und dennoch die eingabe mit einem '.' abzubrechen? Als Alternative ist mir zwar cat gekommen, aber hier kann ich dann nur mit crtl-d abbrechen.
Nach langer Spielerei bin ich auf diese Lösung gekommen: #! /bin/bash echo "Enter the text (a single '.' or [CTRL-D] on a newline finishes):" while read in ; do MSG=`echo -E "${MSG}\\n${in}"` if [[ "${in}" = "." ]] ; then break fi done echo -e "${MSG}" Hoffe, es hilft dir. Gruß Marcus
Hallo Marcus, Hallo * Am Montag, 27. Dezember 2004 19:15 schrieb Marcus Habermehl:
Am Montag, den 27.12.2004, 12:23 +0100 schrieb Andreas Loesch:
ich hab hier ein kleines Script Problem und hoffe Ihr habt eine Idee:
Nach langer Spielerei bin ich auf diese Lösung gekommen:
dann hoffe ich, dass die Spielerei auch etwas Spass gemacht hat :) [...] ist vom Prinzip mit der Idee von Christian ähnlich, erst einen String aufzubauen, aber hat das gleiche Problem, wenn ich das hier:
echo -e "${MSG}"
als MSG=` echo -e "${MSG}"` schreibe die trailing \n verloren gehen.
Hoffe, es hilft dir.
Ansonsten ja, danke, Gruss Andreas
Hallo Andreas, hallo Leute, Am Montag, 27. Dezember 2004 12:23 schrieb Andreas Loesch:
ich hab hier ein kleines Script Problem und hoffe Ihr habt eine Idee:
Ziel: es soll Interaktiv ein Text von stdin eingelesen werden, der Text soll entweder mit einem '.' in einer sonst leeren Zeile oder mit ctrl-d fertig sein (vgl. mail)
z.zt. hab ich das so gelöst:
readInteractive() { echo "Enter the Text (a single '.' or [CTRL-D] on a newline finishes):" while read in do if [[ $in = '.' ]] ; then break ; fi MSG=`echo -e "$MSG\n$in"` done }
Problem: wenn ich leere zeilen eingeben will, verschwinden die :( read akzeptiert keine leeren Zeilen.
Doch, allerdings scheint bei Backtick-Operationen \n am Ende entfernt zu werden (auch bei mehrfachem Vorkommen).
Frage: womit kann ich read ersetzen, um auch leere Zeilen zu bekommen und dennoch die eingabe mit einem '.' abzubrechen? Als Alternative ist mir zwar cat gekommen, aber hier kann ich dann nur mit crtl-d abbrechen.
readInteractive() { echo "Enter the Text (a single '.' or [CTRL-D] on a newline finishes)" while read in do if [[ $in = '.' ]] ; then break ; fi # (bis hierher unverändert) MSG="$MSG\n$in" # erstmal nur zusammensetzen done echo "+++ test 1" # Testausgabe 1 echo -e "$MSG" echo "+++ test 1 ende" MSG="`echo -e \"$MSG\"`" # jetzt \n durch Zeilenumbrüche ersetzen echo "+++ test 2" # Testausgabe 2 echo "$MSG" echo "+++ test 2 ende" } Leerzeilen mitten in der Eingabe ("test\n\ntext") bleiben auf jeden Fall erhalten. Leerzeilen am Ende der Eingabe ("testtext\n\n\n") werden durch die Backticks "verschluckt". Wenn Du auf das Expandieren in Backticks verzichten kannst, bekommst Du (wie bei test 1) alle Leerzeilen. Ach so: Du solltest ganz am Anfang der Routine unset MSG verwenden, sonst wird es bei mehrfachem Aufruf interessant ;-) Gruß Christian Boltz -- Ich hasse Kabel, denn sie haben zwei Enden und meist sitzt an jedem Ende ein Anderer, der schuld ist. [Thomas Arend in suse-linux]
Hallo Christian, Hallo * Am Montag, 27. Dezember 2004 21:42 schrieb Christian Boltz:
Am Montag, 27. Dezember 2004 12:23 schrieb Andreas Loesch:
ich hab hier ein kleines Script Problem und hoffe Ihr habt eine Idee:
Ziel: es soll Interaktiv ein Text von stdin eingelesen werden, der Text soll entweder mit einem '.' in einer sonst leeren Zeile oder mit ctrl-d fertig sein (vgl. mail) [...] Problem: wenn ich leere zeilen eingeben will, verschwinden die :( read akzeptiert keine leeren Zeilen.
Doch, allerdings scheint bei Backtick-Operationen \n am Ende entfernt zu werden (auch bei mehrfachem Vorkommen).
nagut :) und wo steht das schon wieder... [...]
MSG="$MSG\n$in" # erstmal nur zusammensetzen
die Idee ist gut, danke! Auf die abschließenden Leerzeilen kann ich wohl verzichten, so dass ich so und mit
MSG="`echo -e \"$MSG\"`" # jetzt \n durch Zeilenumbrüche ersetzen
dem hier hinkomme.
Wenn Du auf das Expandieren in Backticks verzichten kannst, bekommst Du (wie bei test 1) alle Leerzeilen.
evtl. geht das auch, muss ich mal überlegen, ansonsten könnte ich die letzten \n zählen und damit noch etwas basteln...
Ach so: Du solltest ganz am Anfang der Routine unset MSG verwenden, sonst wird es bei mehrfachem Aufruf interessant ;-)
z.zt. wir die Routine nur einmal aufgerufen :) aber danke für den Hinweis Gruss Andreas
participants (3)
-
Andreas Loesch
-
Christian Boltz
-
Marcus Habermehl