Shell Script

Nils Kassube kassube at gmx.net
Mon Nov 23 08:40:32 GMT 2009


Luise Kunkle wrote:
> Irgendwo habe ich gelesen, dass die shell unter ubuntu nicht mehr die
>  bash ist und dass man darauf achten muss, was "da oben links" steht.
>  Ist das bei meinem script ok?

Die Standardshell bei Ubuntu ist dash, soll heißen, dass /bin/sh ein 
Link auf /bin/dash ist. Das Problem: Üblicherweise wurde bei älteren 
Distributionen bash als Standard verwendet und viele Scripte verwenden 
Eigenheiten der bash obwohl sie mit "#!/bin/sh" beginnen. Wenn man aber 
Besonderheiten der bash verwenden will, muss man die bash auch explizit 
angeben mit "#!/bin/bash". Solange du nur die bei allen Shells 
vorhandenen Funktionen verwendest, ist "#!/bin/sh" aber OK. Womit das 
Script beginnt, ist also abhängig davon, welche Funktionen du verwenden 
willst. Ich habe mir angewöhnt, immer "#!/bin/bash" zu verwenden, damit 
ich nicht immer wieder recherchieren muss, was die Standardshell nun 
kann oder nicht.

> Wie man sieht, will ich, dass der gleiche Vorgang immer wiederholt
>  wird - ich habe das zwar (in etwa) hin bekommen - aber ich weiß,
>  dass es "eleganter" geht. Bin aber auf der Suche nach der syntax
>  verzweifelt.
> 
> Weiß jemand die syntax, damit das Programm immer die nächst höhere
>  Zahl in die Klammer setzt, bis keine "nächst-höhere" mehr da ist?

Du meinst die Zahl im Suchausdruck? Das könnte dann so aussehen 
(ungetestet):

sgrep '"]" .. "[t]"' $sourcefile > $goalfile ; #fuer toxisch
declare -i n=1
while sgrep '"]" .. "['$n']"' $sourcefile >> $goalfile ; do
  n=$n+1
done

Das geht aber schonmal nicht mit der dash, denn Integer-Variablen kann 
man dort mit declare nicht festlegen, also wird das "#!/bin/bash" am 
Scriptanfang benötigt. Wenn du es portabel haben willst (mit 
"#!/bin/sh"), sähe das eher so aus (auch ungetestet):

n=1
while sgrep '"]" .. "['$n']"' $sourcefile >> $goalfile ; do
  n=$(( $n + 1 ))
done

> Die Zieldatei soll natürlich nicht immer wieder überschrieben werden,
> sondern es soll angehängt werden,* nach 2 Zeilenumbrüchen*. Was muss
>  ich da schreiben?

Hmm, da habe ich nun nicht verstanden, was du meinst. Mit >> fügst du 
doch schon ans Ende der Datei an ohne sie zu überschreiben.


Nils