Am Donnerstag, 14. August 2003 00:22 schrieb Christian Boltz:
Hallo Jan, hallo Thomas, hallo Leute,
Hallo Christian, zu gern wuerde ich so fit in Sachen Shell sein, wie Du, Jan uva. :-)
Stark verkürztes Beispiel:
#!/bin/bash zaehler=0
echo -e "a\nb\nc\nd" | { # ^----- hier startet die Subshell while read line do zaehler=`expr $zaehler + 1` done
echo Anzahl: $zaehler
exit } # erst hier endet die Subshell!
Erklärung aus man bash:
{ list; } list is simply executed in the current shell envi- ronment. list must be terminated with a newline or semicolon.
Diese Loesung gefaellt mir! (Laeuft auch schon problemlos)
BTW: Du verwendest Backticks, um die Variable "$zaehler"eins hochzuzählen: zaehler=`expr $zaehler + 1` Das startet ein externes Programm in einer Subshell - wenig performant ;-) Genausogut funktioniert die (vermutlich bash-spezifische) Variante zaehler=$(($zaehler+1)) - und das ohne Subshell ;-) Eine weitere Variante ohne Subshell wäre let zaehler=$zaehler+1
Deine beiden Beispiele sind laut man bash voellig identisch. Leider bin ich nicht selbst drauf gestossen:-( ((expression)) The expression is evaluated according to the rules described below under ARITHMETIC EVALUATION. If the value of the expression is non-zero, the return status is 0; otherwise the return status is 1. This is exactly equivalent to let "expression". Ich habe mir im Laufe der letzten Jahre verschiedene Sachen ausgearbeitet und als Muster abgelegt. Das ersparte mir bisher viel Sucherei. Jetzt kann ich meine Beispiele wieder etwas erweitern:-) Danke! Du zeigst mir oben, wie ich ohne Backticks, also ohne weitere Subshell, rechnen kann. Nach solch einer Variante hatte ich bisher leider nie gesucht - ging ja auch immer nach meinem Muster:-) Wie koennte ich nun auch folgendes besser Loesen?: (vielleicht geht´s ja auch ohne nach cut zu pipen?) read line myvar=`echo "$line" | cut -c 4-11` Wenn ich auch hier die SubShell umgehen koennte, wuerde das einen enormen Geschwindigkeitsvorteil bringen - vermute ich mal. Diese Art Variablenzuweisung laeuft mehrfach in einem umfangreichen case - esac Block. Ich war schon auf der Suche nach sowas wie SrtLen, StrPos, StrMove usw. In dieser Art scheint es jedoch kein Aequivalent in der Shell zu geben - sagt jedenfalls 'bash -c help' und in 'man bash' wurde ich auch nicht fuendig. Vielleicht habe ich ja wieder Tomaten auf den Augen? Besten Dank fuer Eure Bemuehungen! MfG Th. Moritz -- Geisterfahrer sind oft sehr entgegenkommend!