On Sam, 03 Mai 2003 at 21:04 (+0200), Thomas Michalka wrote:
Jan Trippler schrieb: [...]
Das obige Konstrukt lebt ja davon, dass dem awk quasi ein { print $2 } *untergeschoben* wird. Man kann dem awk aber auch Shell-Variablen übergeben:
jan@k500:~> echo pos1 pos2 pos3 | awk ' { print $pos } ' pos=2 pos2
Das ist doch keine Parameterübergabe im eigentlichen Sinn, also kein Argument für awk. Die Zuweisung pos=2 gehört doch zur Bash. *Bevor* awk letztlich aufgerufen wird, wird schon in der Shell 'pos' durch '2' ersetzt, oder sehe ich das falsch?
Schau Dir mal folgendes Konstrukt dazu an: jan@k500:~/tmp> echo pos1 pos2 pos3 | awk ' { print $pos; pos=3; print $pos; print '$pos', pos; } ' pos=2 pos2 pos3 2 3 Es gibt einen Unterschied zwischen der awk-Variablen pos und der Shell-Variablen $pos, der letzte print zeigt das. Deshalb findet hier schon eine Parameter-Übergabe statt, es wird ja innerhalb des awk mit der awk- und nicht der Shell-Variablen gearbeitet. Das ist der Unterschied zur $'$pos' Variante, bei der ja praktisch der Teil '$pos' sich ausserhalb des awk befindet und durch die Shell ausgewertet wird. Die Zuweisung pos=2 ist keine bash-Zuweisung, sondern ein Argument des awk. Gerade ist mir noch ein besseres Beispiel eingefallen: jan@k500:~/tmp> pos=1 jan@k500:~/tmp> echo pos1 pos2 pos3 | awk ' { print $pos; pos=3; print $pos; print '$pos', pos; } ' pos=2 pos2 pos3 1 3 jan@k500:~/tmp> unset pos jan@k500:~/tmp> echo pos1 pos2 pos3 | awk ' { print $pos; pos=3; print $pos; print '$pos', pos; } ' pos=2 awk: cmd. line:1: { print $pos; pos=3; print $pos; print , pos; } awk: cmd. line:1: ^ parse error Du siehst also, dass die awk-Variable pos und die Shell-Variable $pos zwei Paar Schuhe sind. Die Verwirrung wäre vielleicht nicht so groß gewesen, wenn ich die Variablen unterschiedlich genannt hätte ;-) [...]
Ansonsten sind die im System vorhandenen Scripts eine gute Lektüre.
Das gilt, wie ich finde, für die wenigsten. Die meisten sind IMHO äußerst bescheiden bzw. gar nicht kommentiert. Wenn man dauernd damit befaßt ist, reicht einem (dem Autor) das vielleicht, aber anderen ... Bei vielen Skripten hat man nicht mal den Eindruck, daß die Bash hier eine Programmiersprache bereitstellt. Wenn man zum Beispiel irgendwelche nichtoffensichtlichen Zeichenmanipulationen vornimmt, sollte man wenigstens kommentieren, *was* man da tut, vielleicht auch *warum*. Das *wie* kann man getrost der Recherche des Lesers überlassen, denn die Syntax muß man eh lernen. Allerdings ist einiges schon recht tricky programmiert - um das zu verstehen muß man schon ein Bash-Kenner sein. Auch nicht gerade im Sinne der Transparenz und Wartbarkeit ...
*real programmers do not comment* ;-) Was ich meinte war, dass die im System vorhandenen Scripts einen großen Teil der Fähigkeiten der bash abdecken. Sie können natürlich kein Lehrbuch im klassischen Sinn abdecken und beim intensiven Auseinandersetzen mit fremdem Code lernt man IMHO am besten (auch wenn es mühsamer ist und länger dauert). Jan