Mailinglist Archive: opensuse-de (4684 mails)
| < Previous | Next > |
Re: bash: mehrface for-Schleife
- From: Jan.Trippler@xxxxxxxxxxx (Jan Trippler)
- Date: Sun, 4 May 2003 11:41:58 +0200
- Message-id: <20030504114158.A28819@xxxxxxxxxxxxxx>
On Sam, 03 Mai 2003 at 21:04 (+0200), Thomas Michalka wrote:
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
;-)
[...]
*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
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
| < Previous | Next > |