Hallo, On Wed, 18 Sep 2002, Jan Trippler wrote:
On 18 Sep 2002 at 5:43, David Haller wrote:
On Tue, 17 Sep 2002, Jan Trippler wrote: [...]
#!/bin/bash DBFILE="telefonliste.txt"
cat $DBFILE | while read zeile; do BK="`echo $zeile | cut -f1 -d:`" VN="`echo $zeile | cut -f2 -d:`" # usw. done
*boerks*
(du meintest uebrigens '-d;', nicht '-d:'...
Jaha, dann vorsichtshalber gequoted: -d';' (ich weiss nicht, obs not tut, aber bei nem ; bin ich mal vorsichtig).
Aeh, ja klar :) Muss man quoten.
Uebrigens: ich habe die Erfahrung gemacht, dass obige Quotingweise falsch ist, wenn z.B. Leerzeichen auftauchen, richtig ist:
BK=`echo "$zeile" | ...`
Die "geechote" Variable muss gequotet werden, die `` nicht.
Eben nicht. Dem echo ist es nämlich egal, wie viele Argumente er kriegt, und mir als Nutzer des echo ist es ebenfalls schnurz, wie viele Argumente der echo't. Was aber _nicht_ egal ist, dass ist der Umstand, dass die Zuweisung BK=... nur bis zum ersten Blank funktionuckelt. Deshalb würde ich die "" gerne da lassen, wo ich sie hatte ;-)
$ touch oberboerks $ foo="bla : bla fasel;: *boerks*" $ bar="`echo $foo | cut -d':' -f3`" $ echo "'$bar'" ' oberboerks' $ bar=`echo "$foo" | cut -d':' -f3` $ echo "'$bar'" ' *boerks*' Merkst du was? Und ja, die bash interpretiert das `` als ein "Token", das quoten ist ueberfluessig, die Leerzeichen ueberlebens sowieso, aber andere Metazeichen nur, wenn das echo-Argument gequoted wird.
Dann eher noch:
==== sed 's/ /_/g' < $DBFILE | \
*grrr* genau das wollte ich die ganze Zeit verhindern. Dann sind die Blanks weg, und das Rekonstruieren klappt nur dann, wenn ich sicher sein kann, dass es im Originaltext keine _ gab. Der sed ist nebenbei gesagt in Deinem folgenden Beispiel auch gar nicht notwendig. Der read holt sich die Zeile bis zum Linefeed und anschliessend haben durch das Umsetzen von IFS eh alle Leerzeichen verloren.
Aeh, ja klar, ich dachte, das Ersetzen sei generell gewollt, und nicht nur um die Leerzeichen fuer den naechsten "Schritt" zu maskieren. Also, dann natuerlich ohne sed ;)
while read zeile do OIFS="$IFS"; IFS=";" set -- $zeile ## nein, $zeile darf hier nicht gequotet werden! IFS="$OIFS" BK="$1"; VN="$2"; NN="$3"; ST="$4"; HN="$5"; WO="$6" PL="$7" VWP="$8"; TP="$9"; VWG="${10}"; TG="${11}"; VWF="${12}" # ... done ====
Zur Erinnerung: einen externen Prozess aufzurufen ist "teuer". Und das pro Zeile einmal pro Variable duerfte dir die Performance recht deutlich versauen. [...]
Das ist richtig, deshalb würde ich privat immer dem awk oder perl den Vorzug geben. Mir ist persönlich nur das IFS-Geschubse nicht sehr sympathisch, aber das ist tiefster IMHO- Modus ;-)
Oh, IFS ist sehr praktisch und ein sehr probates Mittel. Bsp: $ OIFS="$IFS"; IFS=":"; set -- `grep '^dh' /etc/passwd`; echo "$7"; IFS="$OIFS" /bin/bash Auch nett: $ OIFS="$IFS"; IFS=":"; set -- `grep '^dh' /etc/passwd`; for i; do echo "'$i'"; done"; IFS="$OIFS" (das '^dh' jew. durch dem eigenen Usernamen ersetzen) Oder (aus /var/lib/texmf/web2c/mktexnam): OIFS=$IFS;IFS=$SEP set x `kpsewhich --expand-path='$TEXMF/fonts'"$SEP$MT_VARTEXFONTS"` shift; IFS=$OIFS for i do test -z "$i" && continue case "$fullname" in $i/*) [..] esac done
BTW: Geht denn das, Positionsparameter $10 usw.?
Na klar geht das, man muss aber ${nn} verwenden, da die bash sonst aus $13 ein ${1}3 macht. $ OIFS="$IFS"; IFS=":"; set -- `grep '^dh' /etc/passwd; grep '^dh' /etc/passwd`; echo "'$1' '$13' '${13}'"; IFS="$OIFS" 'dh' 'dh3' '/bin/bash'
Brauchen wir da nicht ein wenig Shifterei?
Noe. Obiges war getestet. Shiften ginge aber natuerlich auch. -dnh -- "We demand rigidly defined areas of doubt and uncertainty!" -- Vroomfondel