Δημοσιεύτηκε: 26 Νοέμ 2011, 16:09
από simosx
Κώδικας: Επιλογή όλων
#!/bin/bash

find -name "*.dsl.dz" | while read i; do dictunzip "$i"; done
find -name "*.dsl" | while read i; do iconv "$i" -f UTF-16 -t UTF-8 -o "$i".bak; done
find -name "*.bak" | while read i; do sed -i '/^[ \t\#]/!s/\(.*\)/\1\n\|\1/g' "$i"; done
find -name "*.bak" | while read i; do sed -i -e '/^|/s/[αάάᾳἀἅἄἁὰἂἃἄᾄᾇᾆᾷᾅᾶᾴᾁᾆᾷἇᾄᾴᾁᾀἅᾀᾳᾅἃἂἆᾶὰἁἀἇἆ]/a/g' -e '/^|/s/β/b/g' "$i"; done
find -name "*.bak" | while read i; do sed -i 's/^|//g' "$i"; done
find -name "*.bak" | while read i; do sed -i '$!N; /^\(.*\)\n\1$/!P; D' "$i"; done
find -name "*.bak" | while read i; do iconv "$i" -f UTF-8 -t UTF-16 -o "${i/.bak}"; done
find -name "*.bak" | while read i; do rm "$i"; done
find -name "*.dsl" | while read i; do dictzip "$i"; done;


Ένα πρώτο βήμα θα ήταν να γραφτεί όπως παραπάνω.
Η διαφορά με το αρχικό σου είναι ότι όταν αποτύχει μια από τις εντολές, τότε οι επόμενες εντολές δεν εκτελούνται.
Με την παραπάνω απλή εκδοχή όλες οι εντολές εκτελούνται. Θα μπορούσα να διαβάζω την τιμή εξόδου της προηγούμενης εντολής και με if να επιτρέπω να συνεχίσει ή όχι.
Αυτό το κάνεις με το να ελέγχεις τη μεταβλητή $?, όπου έχει τιμή 0 αν η προηγούμενη εντολή εκτελέστηκε με επιτυχία, διαφορετικά υπήρξε πρόβλημα.

Με το '|' χρησιμοποιείς ήδη σωληνώσεις (pipes).

Μια βελτίωση θα ήταν να καταγράφεις το αποτέλεσμα της `find -name "*.bak"` σε μια μεταβλητή, ώστε να το επαναχρησιμοποιείς.
Π.χ.
Κώδικας: Επιλογή όλων

files_bak=`find -name "*.bak"`
echo $files_back | while.......
echo $files_back | while.......
echo $files_back | while.......