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