Scriptaki gia metatropi wma se mp3 meso vlc

Giorgos Keramidas keramida at ceid.upatras.gr
Mon Sep 3 00:57:11 EEST 2007


On 2007-09-02 14:25, voger <vogernewsletters at yahoo.gr> wrote:
> Είχα βρεί αυτό στο linuxquestions.org
>
> #!/bin/bash
> #
> # wma to mp3
[snip script]

Φαίνεται ότι το έχει γράψει "newbie" και μάλιστα "newbie ακόμα και στο
Linux".  Ψιλοάθλιο, αλλά για "quick n' dirty hack" ας πούμε ότι είναι
"υπό συνθήκες ανεκτό" :-P

  * Το bash δεν είναι στο /bin σε όλα τα λειτουργικά συστήματα.

  * Το indentation είναι άθλιο (προφανώς λόγω forum formatting)

> function wma2mp3 () {
>
> if [ ! -f "$1" ]; then
>   echo "File $1 not found!"
> else
>   wav=`ls "$1" | sed -e 's/.wma/.wav/' | tr -d "*"`

Επειδή το script είναι σε bash, μπορεί το "ls" να είναι aliased σε κάτι
που δεν είναι προφανές.  Συνήθως στο Linux _είναι_ aliased με options
του στυλ:

    ls --color=auto -bFA

Η παραδοχή πως "ότι δεν είναι file είναι μάλλον κατάλογος" δεν ισχύει αν
το "$1" είναι symbolic link (για παράδειγμα).

Το tr(1) invocation είναι αποτέλεσμα της κακής χρήσης της ls(1) ως
υποκατάστατου ενός εργαλείου όπως η find(1).

>   mplayer -ao pcm "${1%%.[Ww][Mm][Aa]}.wav" "$1" &&
>   mv audiodump.wav "$wav" && unset wav &&
>   lame -h -b 192 "${1%%.[Ww][Mm][Aa]}.wav" "${1%%.[Ww][Mm][Aa]}.mp3" &&
>   rm -f "${1%%.[Ww][Mm][Aa]}.wav" ||
>   echo "There was a problem with the conversion process!"

Δεν είναι "αισθητικά ωραίο" να τελειώνει μια γραμμή σε "&&" θεωρώντας
πως το bash θα συνεχίσει να διαβάσει στην επόμενη γραμμή την υπόλοιπη
εντολή.  Καλύτερα τέτοιες γραμμές να γράφονται ως:

        cmd && \
            cmd2 && \
            cmd3

Με προκαθορισμένο indentation level 8 spaces ή ένα TAB, indentation των
των "continuation lines" ίσο με 4 και backslash στο τέλος των γραμμών
που συνεχίζονται αμέσως παρακάτω είναι πιο "οπτικά εύκολο" να καταλάβει
κανείς τι παίζει.

Το substitution "${1%%.[Ww][Mm][Aa]}.wav" δε χρειάζεται, αφού κάνει
ακριβώς ότι και το assignment της $wav παραπάνω, αλλά με λίγο πιο
πολυλογάδικο τρόπο.

> # convert all wma files in directory
> if [ $# -eq 1 -a -d "$1" ]; then
>   for file in $1/*.[Ww][Mm][Aa]; do
>     wma2mp3 "$file"
>   done
>   exit
> fi

Λείπουν quotes γύρω από το "$1" και ο τρόπος με τον οποίο ψάχνει για
filename matches το for έχει τα γνωστά command-line length limits που
έχουμε πει κάμποσες φορές στη λίστα.

> # One or more wma files were given
> for file in $*; do
>   wma2mp3 "$file"
> done

Επανάληψη του κώδικα που έχει ακριβώς παραπάνω.  Όταν βλέπεις ότι σε ένα
shell script χρειάζεται να γράψεις ακριβώς το ίδιο κομμάτι δύο φορές,
είναι ώρα να το κάνεις ένα function πια.

> # Not enough information
> if [ $# -lt 1 ]; then

Προσωπικά προτιμώ να έχω αποκλείσει ΠΡΙΝ από όλα τα υπόλοιπα την
περίπτωση usage error.  Η οργάνωση των if/then blocks σε αυτό το script
είναι εντελώς "τυχαία" και τα error conditions τα ελέγχει ξανά και ξανά,
με αποτέλεσμα η λογική της χρήσης του script να μην είναι τόσο προφανής
και να πρέπει να αλλάξει σε 3 ή παραπάνω μέρη αν αποφασίσεις κάποια
στιγμή να το αλλάξεις κάπως.

Μέσα σε όλα αυτά, είναι ενδιαφέρον που το script προσπαθεί να φερθεί
έξυπνα και να μετατρέπει όλα τα αρχεία ενός καταλόγου αν ένα
command-line argument δεν είναι file αλλά κατάλογος.  Χρήσιμο κόλπο.




More information about the Linux-greek-users mailing list