[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [Vielleicht OT]Bash-Script-Programmierung



Hallo,

Am Mit, 12 Mai 2010, Peter Schütt schrieb:
>Ausschnitt aus meinem Skript, was das tut:
>
>for file in $ROOT/subdir/*.dat; do

Quoten!

for file in "${ROOT}/subdir/"*.dat; do

>   DESTFILE=$ROOT/destdir/`basename $file`

Quoten!

DESTFILE="${ROOT}/destdir/`basename \"$file\"`"

Bash:

DESTFILE="${ROOT}/destdir/$(basename "$file")"

oder besser noch:

DESTFILE="${ROOT}/destdir/${file##*\/}"
   
>   if [ -e $DESTFILE ]; then

Quoten!

if test -e "$DESTFILE"; then

Die '[ '+' ]'-Syntax finde ich irritierend und sie ist anfällig (wenn
man die Leerzeichen vergisst).

>     DESTPREFIX=$ROOT/destdir/`basename $DESTFILE .dat`

Quoten und s.o.:

DESTPREFIX="${ROOT}/destdir/$(basename "$DESTFILE" .dat)"

Oder besser:

DESTPREFIX="${DESTFILE//.dat/}"

>     N=2
>     DESTFILE=`echo $DESTPREFIX`_$N.dat

Quoten!

DESTFILE="${DESTPREFIX}_${N}.dat"

>     while [ -e $DESTFILE ]

Quoten und s.o.:

while test -e "$DESTFILE"; do

>        N=$((N+1))
>        DESTFILE=`echo $DESTPREFIX`_$N.dat

Quoten!

DESTFILE="${DESTPREFIX}_${N}.dat"

>     done     
>   fi
>   mv -v $file $DESTFILE

Quoten!

mv -v "$file" "$DESTFILE"

>done

Des weiteren ist das if .. fi überflüssig, du kannst direkt in die
while-Schleife:

DESTPREFIX="${DESTFILE//.dat/}"
while test -e "$DESTFILE"; do
    ...
done

Der var=${var//pat/subst} Befehl ist eh um vieles schneller als auch
nur ein einziger basename Aufruf.

>Zum einen würde ich gerne einmal die Meinung von erfahrenen 
>Skriptprogrammierern zu diesem Code-Abschnitt hören, weil ich bei Skripten 
>noch ein Neuling bin. Insbesondere interessiert mich, ob man die 
>Konstruktion      
>  DESTFILE=`echo $DESTPREFIX`_$N.dat
>besser hinbekommen kann.

s.o.

>Weitere Fragen:
>
>Skript-Programmierung kommt mir als Java-Entwickler wie 
>Steinzeitprogrammierung vor: Kein Debugger, keine IDE, keine Unit-Tests.
>Das Debugging bekommt man nur mit eingestreuten echos hin und Syntax-
>Highlighting ist die einzige Unterstützung, die ich finden konnte.

set -x
set -n

Am wichtigsten ist aber: Variablen immer quoten, wenn man nicht ganz
genau weiß was man tut und daß es anders nicht geht. Dann vermeidet
man schon grob 78,3914% [1] aller Fehler, die üblicherweise so
auftauchen.

-dnh

[1] es gilt das übliche bei statistischen Angaben ;)

-- 
   264: Firewall
          Firewalls schützen vor Viren, Trojanern, Kettenbriefen und
          Taubenscheiße auf dem Autodach. (Martin Schmitt)


Reply to: