zuerst mal Entschuldigung, weil zu diesem Thema hier erst kürzlich ein
Thread lief, aber mein Newsserver hat den blöderweise schon entsorgt :-(
Zum Problem:
ich lese eine Datei zeilenweise mit read ein:
while read line; do
...irgendwas...
done < ~/meine/Datei
Zu einigen der Zeilen in der Datei sind jetzt Fragen an den Benutzer
nötig, aber wenn ich jetzt sowas mache wie
while read line; do
...
echo "Diese Zeile bearbeiten?"
read editline
...
done < ~/meine/Datei
dann liest auch das read innerhalb der Schleife aus der Datei und man
kann keine händischen Eingaben machen. Nun könnte man zwar zuerst mit
einer while-Schleife die Datei einlesen, dabei fortlaufend jede Zeile in
einer Variablen speichern und anschließend diese Variablen nacheinander
durchgehen und dem Benutzer die Fragen stellen, aber das erscheint mir
recht unelegant.
Ich hoffe, jemandem fällt dazu noch was besseres ein.
Danke für alle Tips,
Jan
#!/bin/sh
file=/etc/passwd # Beispiel
while read line ; do
echo "Zeile: $line"
echo -n "Bearbeiten? "
read answer < /dev/tty
echo "Antwort war: $answer"
done < $file
Gruß,
Lars
>> Zu einigen der Zeilen in der Datei sind jetzt Fragen an den Benutzer
>> nötig, aber wenn ich jetzt sowas mache wie
>
> file=/etc/passwd # Beispiel
>
> while read line ; do
> echo "Zeile: $line"
> echo -n "Bearbeiten? "
> read answer < /dev/tty
> echo "Antwort war: $answer"
> done < $file
Das hat den Nachteil, daß man die Eingabe an das Skript nicht ohne
weiteres umlenken kann. Solange kein zwingender Grund vorliegt, vom
Terminal selbst zu lesen, ist
file=/etc/passwd
exec 3<&0
while read line
do
echo "Zeile: $line"
printf %s 'Bearbeiten? '
read answer <&3
echo "Antwort war: $answer"
done < $file
exec 3<&-
vorzuziehen. Zu »echo -n« konsultiere groups.google.com.
Grüße,
Gunnar
>Hallo,
>ich lese eine Datei zeilenweise mit read ein:
>while read line; do
> ...irgendwas...
>done < ~/meine/Datei
>Zu einigen der Zeilen in der Datei sind jetzt Fragen an den Benutzer
>nötig,
Versuch mal:
exec 3<&0
while read line; do
echo -n "Zeile '$line'. Na? "
antwort=`(read x; echo $x) 0<&3`
echo "Zeile '$line', Antwort '$antwort'"
done <./testfeil
Hat gerade zu funktionieren behauptet. Das 'echo $x' und die Backticks
koennen Dich natuerlich beliebig stoeren... Wenn Du read nicht brauchst,
sondern einfach eine Zeile willst, wie waere statt dessen
exec 3<&0
while read line; do
echo -n "Zeile '$line'. Na? "
antwort=`head -1 0<&3`
echo "Zeile '$line', Antwort '$antwort'"
done <./testfeil
Sind damit noch irgendwelche Quotenprobleme zu erwarten? Mir scheint's sauber.
Gruss
Patrick
> exec 3<&0
> while read line; do
> echo -n "Zeile '$line'. Na? "
»echo -n« ist nicht portabel. Die Ausgabe von '$line' erscheint mir
einigermaßen sinnfrei.
> antwort=`head -1 0<&3`
Für ein einfaches yes/no ist das sicher Overkill, oder erwartest
Du Backslashes in der Antwort?
> echo "Zeile '$line', Antwort '$antwort'"
S.o.
> done <./testfeil
^^
Wozu diese beiden Zeichen dienen sollen, mußt Du mir mal erklären.
> Mir scheint's sauber.
Naja.
Grüße,
Gunnar
Gunnar Ritter <g...@bigfoot.de> wrote:
>> file=/etc/passwd # Beispiel
>>
>> while read line ; do
>> echo "Zeile: $line"
>> echo -n "Bearbeiten? "
>> read answer < /dev/tty
>> echo "Antwort war: $answer"
>> done < $file
> Das hat den Nachteil, daß man die Eingabe an das Skript nicht ohne
> weiteres umlenken kann. Solange kein zwingender Grund vorliegt, vom
> Terminal selbst zu lesen, ist
> file=/etc/passwd
> exec 3<&0
Zitiere "configure":
# File descriptor usage:
# 0 standard input
# 1 file creation
# 2 errors and warnings
# 3 some systems may open it to /dev/tty
# 4 used on the Kubota Titan
-> lieber erst FD 5 benutzen?
> while read line
> do
> echo "Zeile: $line"
> printf %s 'Bearbeiten? '
> read answer <&3
Spricht etwas gegen
read -p 'Bearbeiten? ' answer <&5
?
> echo "Antwort war: $answer"
> done < $file
> exec 3<&-
Tschau. Tino.
--
* LINUX - Where do you want to be tomorrow? *
http://www.tu-chemnitz.de/linux/tag/
>> exec 3<&0
> Zitiere "configure":
> # File descriptor usage:
> # 0 standard input
> # 1 file creation
> # 2 errors and warnings
Soweit klar.
> # 3 some systems may open it to /dev/tty
Kennt jemand eines dieser »some systems«?
> # 4 used on the Kubota Titan
Was zur Hölle ist das denn?
> -> lieber erst FD 5 benutzen?
An Tips aus autoconf ist oft etwas dran, für configure und Skripte mit
ähnlichem Portabilitätsanspruch sollte man das wohl im Hinterkopf
behalten. Allerdings würde ich trotzdem gerne mal wissen, welche
Systeme derart broken sind - wenn die älter als ~10 Jahre sind, wäre
es mir persönlich egal.
> Spricht etwas gegen
> read -p 'Bearbeiten? ' answer <&5
> ?
Ja. Es ist eine komplett nutzlose bash-Erweiterung, da es keinen
irgendwie gearteten Vorteil gegen printf (ggf. in Kombination
mit »test -t 5«) bietet. Typisch GNU-Bloat eben. Besonders dumm
ist, daß »read -p« in der ksh etwas völlig anderes tut.
Grüße,
Gunnar
Ihr seid klasse. Danke an alle!
Tschüß,
Jan