Wie löse ich folgendes Beispiel NAMEdb="Hans Huber" NAMEWORT1=`echo "$NAMEdb" | cut -f 1 -d" "` NAMEWORT2=`echo "$NAMEdb" | cut -f 2 -d" "` NAME1="$NAMEWORT1" "$NAMEWORT2" # Hans Huber NAME2="$NAMEWORT2" "$NAMEWORT1" # Huber Hans OPTIONS="$NAME1 $NAME2 Abbruch" select opt in $OPTIONS; do if [ "$opt" = "$NAME1" ]; then echo $NAME1 exit -1 elif [ "$opt" = "$NAME2" ]; then echo $NAME2 exit -1 else echo unbrauchbar exit -1 fi done Problem ist also, dass die Leerzeichen in den Namen als neue Option interpretiert werden: 1) Hans 2) Huber 3) Huber 4) Hans 5) Abbruch Al
Hallo, Am Sat, 13 Dec 2003, Al Bogner schrieb:
Wie löse ich folgendes Beispiel
NAMEdb="Hans Huber"
NAMEWORT1=`echo "$NAMEdb" | cut -f 1 -d" "` NAMEWORT2=`echo "$NAMEdb" | cut -f 2 -d" "`
NAME1="$NAMEWORT1" "$NAMEWORT2" # Hans Huber NAME2="$NAMEWORT2" "$NAMEWORT1" # Huber Hans
OPTIONS="$NAME1 $NAME2 Abbruch"
select opt in $OPTIONS; do if [ "$opt" = "$NAME1" ]; then echo $NAME1 exit -1 elif [ "$opt" = "$NAME2" ]; then echo $NAME2 exit -1 else echo unbrauchbar exit -1 fi done
Problem ist also, dass die Leerzeichen in den Namen als neue Option interpretiert werden: 1) Hans 2) Huber 3) Huber 4) Hans 5) Abbruch
Dein Problem ist IFS. Siehe dazu: man -P'less +/\ \ IFS\ \ ' bash Beispiel: $ ( NAME1="Hans Huber"; NAME2="Huber Hans"; OPTIONS="${NAME1}:${NAME2}:Abbruch"; OIFS="$IFS"; IFS=":"; select opt in $OPTIONS; do echo $opt; done; IFS="$OIFS"; ) 1) Hans Huber 2) Huber Hans 3) Abbruch #? Statt dem ':' musst du dir halt ein passndes Zeichen suchen, dass nicht in den Variablen vorkommt. Als Trennzeichen geht fast jedes Zeichen (anscheinend alles ausser 0x00, 0x01 und 0x7F) z.B. auch ASCII 0x06 (ACK): $ ( FS="`echo -en '\x06'`"; NAME1="Hans Huber"; NAME2="Huber Hans"; OPTIONS="${NAME1}${FS}${NAME2}${FS}Abbruch"; OIFS="${IFS}"; IFS="${FS}"; select opt in $OPTIONS; do echo $opt; break; done; IFS="${OIFS}"; ) 1) Hans Huber 2) Huber Hans 3) Abbruch #? Man beachte dabei bitte, wie die Variablennamen beim Zugriff durch ${} voneinander abgegrenzt sind. -dnh PS: Du willst dich evtl. naeher mit "read" beschaeftigen: NAME1="Hans Huber"; NAME2="Huber Hans"; read -p "1) ${NAME1} 2) ${NAME2} 3) Abbruch ?" answer; case $answer in 1) echo $NAME1;; 2) ... *) exit 1;; esac Und da waere noch mein "xreadline", das bietet noch einen editierbaren default an... Das bietet sich v.a. an, wenn man einen default editieren moechte. $ answer=`xreadline "prompt: " "/tmp/xreadline.tmp"` && echo "$answer" prompt: /tmp/foo.tmp /tmp/foo.tmp [hier stand hinter "prompt: " zuerst das '/tmp/xreadline.tmp'...] Dabei stehen praktisch alle Editiermoeglichkeiten der libreadline wie Alt+Backspace, Strg+a, Strg+u usw. zur Verfuegung ;) Bei Interesse kruschtel ich die Quellen mal raus, seh sie nochmal durch, und stell die online oder so ;) --
<logic mode="patent office"> Validator error in line 1: Contradiction in terms. -- C. Faerber, A. Krey
Am Samstag, 13. Dezember 2003 01:54 schrieb David Haller: Hallo David!
Am Sat, 13 Dec 2003, Al Bogner schrieb:
Wie löse ich folgendes Beispiel
NAMEdb="Hans Huber"
NAMEWORT1=`echo "$NAMEdb" | cut -f 1 -d" "` NAMEWORT2=`echo "$NAMEdb" | cut -f 2 -d" "`
NAME1="$NAMEWORT1" "$NAMEWORT2" # Hans Huber NAME2="$NAMEWORT2" "$NAMEWORT1" # Huber Hans
OPTIONS="$NAME1 $NAME2 Abbruch"
select opt in $OPTIONS; do if [ "$opt" = "$NAME1" ]; then echo $NAME1 exit -1 elif [ "$opt" = "$NAME2" ]; then echo $NAME2 exit -1 else echo unbrauchbar exit -1 fi done
$ ( FS="`echo -en '\x06'`"; NAME1="Hans Huber"; NAME2="Huber Hans"; OPTIONS="${NAME1}${FS}${NAME2}${FS}Abbruch"; OIFS="${IFS}"; IFS="${FS}"; select opt in $OPTIONS; do echo $opt; break; done; IFS="${OIFS}"; )
Und da waere noch mein "xreadline", das bietet noch einen editierbaren default an... Das bietet sich v.a. an, wenn man einen default editieren moechte.
Schön langsam habe ich hier Anforderungen, die wirklich nach einer anderen Programmiersprache rufen. In diesem Fall ist es aber so, dass es zu 98% nicht interaktiv ist und die Auswahl nur beim Eintreffen einer Bedingung erscheint, und wie bereits geschrieben, das Script läuft ja schon und muß nur erweitert werden.
$ answer=`xreadline "prompt: " "/tmp/xreadline.tmp"` && echo "$answer" prompt: /tmp/foo.tmp /tmp/foo.tmp
[hier stand hinter "prompt: " zuerst das '/tmp/xreadline.tmp'...]
Dabei stehen praktisch alle Editiermoeglichkeiten der libreadline wie Alt+Backspace, Strg+a, Strg+u usw. zur Verfuegung ;)
Bei Interesse kruschtel ich die Quellen mal raus, seh sie nochmal durch, und stell die online oder so ;)
Ja, das interessiert mich schon. Da es zu o.a. Beispiel passieren könnte, dass es Huber Johann heißen soll, was manuell zu editieren wäre. Ich hatte mir o.a. Anforderung auch schon mit read überlegt, wollte aber einfach mal was mit select machen. Ich habe der Einfachheit nur Vorname Nachname gewählt, tatsächlich könnten aber bis zu 4 Wörter in der Variable stehen, die variiert werden müssen. Al
Hallo Al, [sorry dass das hier ueber die Liste geht] ==== A message that you sent could not be delivered to one or more of its recipients. This is a permanent error. The following address(es) failed: suse-linux@ml03q3.pinguin.uni.cc lowest numbered MX record points to local host ==== Kannst du das mal korrigieren und mir Bescheid geben? Ich wollte dir das readline-Zeug mailen... -dnh -- Wer Digitalkamera-Fotos unbehandelt ins Netz stellt gehoert standrechtlich mit Digitalkameras gesteinigt... -- K. B. Pruenner in dasr
Am Samstag, 13. Dezember 2003 01:54 schrieb David Haller: Hallo David, ausnahmsweise TOFU. Irgendwas mache ich falsch bzw. die beiden Scriptvarianten laufen nicht durch. Ich habe sie mal genau so übernommen, wie du es formuliert hast. # test.sh /usr/local/bin/test.sh: line 3: syntax error near unexpected token `NAME1="Hans Huber"' /usr/local/bin/test.sh: line 3: `$ ( NAME1="Hans Huber"; NAME2="Huber Hans";' Danke! Al
Hallo,
Am Sat, 13 Dec 2003, Al Bogner schrieb:
Wie löse ich folgendes Beispiel
NAMEdb="Hans Huber"
NAMEWORT1=`echo "$NAMEdb" | cut -f 1 -d" "` NAMEWORT2=`echo "$NAMEdb" | cut -f 2 -d" "`
NAME1="$NAMEWORT1" "$NAMEWORT2" # Hans Huber NAME2="$NAMEWORT2" "$NAMEWORT1" # Huber Hans
OPTIONS="$NAME1 $NAME2 Abbruch"
select opt in $OPTIONS; do if [ "$opt" = "$NAME1" ]; then echo $NAME1 exit -1 elif [ "$opt" = "$NAME2" ]; then echo $NAME2 exit -1 else echo unbrauchbar exit -1 fi done
Problem ist also, dass die Leerzeichen in den Namen als neue Option interpretiert werden: 1) Hans 2) Huber 3) Huber 4) Hans 5) Abbruch
Dein Problem ist IFS. Siehe dazu: man -P'less +/\ \ IFS\ \ ' bash
Beispiel:
$ ( NAME1="Hans Huber"; NAME2="Huber Hans"; OPTIONS="${NAME1}:${NAME2}:Abbruch"; OIFS="$IFS"; IFS=":"; select opt in $OPTIONS; do echo $opt; done; IFS="$OIFS"; ) 1) Hans Huber 2) Huber Hans 3) Abbruch #?
Statt dem ':' musst du dir halt ein passndes Zeichen suchen, dass nicht in den Variablen vorkommt. Als Trennzeichen geht fast jedes Zeichen (anscheinend alles ausser 0x00, 0x01 und 0x7F) z.B. auch ASCII 0x06 (ACK):
$ ( FS="`echo -en '\x06'`"; NAME1="Hans Huber"; NAME2="Huber Hans"; OPTIONS="${NAME1}${FS}${NAME2}${FS}Abbruch"; OIFS="${IFS}"; IFS="${FS}"; select opt in $OPTIONS; do echo $opt; break; done; IFS="${OIFS}"; ) 1) Hans Huber 2) Huber Hans 3) Abbruch #?
Man beachte dabei bitte, wie die Variablennamen beim Zugriff durch ${} voneinander abgegrenzt sind.
-dnh
PS: Du willst dich evtl. naeher mit "read" beschaeftigen:
NAME1="Hans Huber"; NAME2="Huber Hans"; read -p "1) ${NAME1} 2) ${NAME2} 3) Abbruch ?" answer; case $answer in 1) echo $NAME1;; 2) ... *) exit 1;; esac
Und da waere noch mein "xreadline", das bietet noch einen editierbaren default an... Das bietet sich v.a. an, wenn man einen default editieren moechte.
$ answer=`xreadline "prompt: " "/tmp/xreadline.tmp"` && echo "$answer" prompt: /tmp/foo.tmp /tmp/foo.tmp
[hier stand hinter "prompt: " zuerst das '/tmp/xreadline.tmp'...]
Dabei stehen praktisch alle Editiermoeglichkeiten der libreadline wie Alt+Backspace, Strg+a, Strg+u usw. zur Verfuegung ;)
Bei Interesse kruschtel ich die Quellen mal raus, seh sie nochmal durch, und stell die online oder so ;)
--
<logic mode="patent office">
Validator error in line 1: Contradiction in terms. -- C. Faerber, A. Krey
Am Samstag, 13. Dezember 2003 10:52 schrieb Al Bogner: Sorry, das war als PM gedacht. Normalerweise sende ich keine Attachments an die Liste. Al
Hallo, Am Sat, 13 Dec 2003, Al Bogner schrieb:
# test.sh /usr/local/bin/test.sh: line 3: syntax error near unexpected token `NAME1="Hans Huber"' /usr/local/bin/test.sh: line 3: `$ ( NAME1="Hans Huber"; NAME2="Huber Hans";'
Das '$' am Anfang gehoert da natuerlich nicht hin, das ist der shell-prompt. -dnh -- 177: Mainframe-Admin Arbeitsschutzschuhe (Holger Spielmann)
Am Samstag, 13. Dezember 2003 01:54 schrieb David Haller:
PS: Du willst dich evtl. naeher mit "read" beschaeftigen:
Mittlerweile denke ich, dass read vielleicht doch die bessere Variante ist.
NAME1="Hans Huber"; NAME2="Huber Hans"; read -p "1) ${NAME1} 2) ${NAME2} 3) Abbruch ?" answer; case $answer in 1) echo $NAME1;; 2) ... *) exit 1;; esac
Und da waere noch mein "xreadline", das bietet noch einen editierbaren default an... Das bietet sich v.a. an, wenn man einen default editieren moechte.
$ answer=`xreadline "prompt: " "/tmp/xreadline.tmp"` && echo "$answer" prompt: /tmp/foo.tmp /tmp/foo.tmp
[hier stand hinter "prompt: " zuerst das '/tmp/xreadline.tmp'...]
Das habe ich noch nicht ganz kapiert. Ich hätte gerne, dass die 1. Möglichkeit (default) mit _nur_ "return" oder aber auch 1 "return" übernommen wird, die 2. mit 2 "return", 3 wäre dann Abbruch und wenn das alles nicht zutrifft, dann wird die Eingabe als Namensbezeichnung verwendet. Bis auf das "nur return für 1" ist das klar. Eventuell könnte man noch überprüfen, ob die Eingabe mit einem Buchstaben beginnt, wenn sie nicht 1, 2 oder 3 ist, falls das nicht zu kompliziert wird. Al
Hallo, Am Sat, 13 Dec 2003, Al Bogner schrieb:
Am Samstag, 13. Dezember 2003 01:54 schrieb David Haller:
PS: Du willst dich evtl. naeher mit "read" beschaeftigen:
Mittlerweile denke ich, dass read vielleicht doch die bessere Variante ist.
*g*
NAME1="Hans Huber"; NAME2="Huber Hans"; read -p "1) ${NAME1} 2) ${NAME2} 3) Abbruch ?" answer; case $answer in 1) echo $NAME1;; 2) ... *) exit 1;; esac
Das habe ich noch nicht ganz kapiert.
Ich hätte gerne, dass die 1. Möglichkeit (default) mit _nur_ "return" oder aber auch 1 "return" übernommen wird, die 2. mit 2 "return", 3 wäre dann Abbruch und wenn das alles nicht zutrifft, dann wird die Eingabe als Namensbezeichnung verwendet. Bis auf das "nur return für 1" ist das klar.
==== prompt="\ 1) ${NAME1} [default] 2) ${NAME2} 3) Abbruch ?"; read -p "$prompt" answer; case "$answer" in 1) name="${NAME1}";; 2) name="${NAME2}";; 3) echo "Abbruch"; exit 0;; *) if test -z "${answer}"; then ## evtl. muss man leerzeichen abfangen # Nur Return gedrueckt name="${NAME1}"; else if test -z "${answer##[a-zA-Z]*}"; then # answer beginnt mit [a-zA-Z] name="$answer" else # ... fi fi ;; esac # mach was mit $name echo "$name" ====
Eventuell könnte man noch überprüfen, ob die Eingabe mit einem Buchstaben beginnt, wenn sie nicht 1, 2 oder 3 ist, falls das nicht zu kompliziert wird.
s.o. -dnh -- "Airplane travel is nature's way of making you look like your passport photo." -- Al Gore
participants (2)
-
Al Bogner
-
David Haller