> Come dice il signor Spok, c'è una prima volta in > tutto... :-) > Se volessi approfondire, in tldp.org trovi almeno un > paio di HOWTO ottimi. ti ringrazio approfondiro' sicuramente :) > > *Errore 3, riga 7* > La forma $(comando) viene sostituita dall'output > dell'esecuzione di comando. > Se grep non trova occorrenze, non restituisce > output, quindi il contenuto di > [ ] sarà una stringa vuota, che per convenzione è un > valore falso: la > procedura non restituisce niente, correttamente. > Ma cosa succede quando grep trova qualcosa, cioè > quando si incontra > un'immagine JPEG? tra [ ] viene messo l'output di > grep, una stringa del tipo > constitution_refit.jpg: JPEG image data, JFIF > standard 1.01 > che manda in errore if. Ah ecco :P Ora comincio a capire per bene.. Prima di iniziare a scrivere qualche script avevo letto un po' di tutorial ma ora ho capito meglio perche' non andava.. Ho provato anche ieri ma non ne ero riuscito a venire a capo :) > Siccome ti interessa sapere solo se l'output di file > contiene la stringa > JPEG, non quale sia il valore della stringa > restituita, puoi usare 2 > soluzioni diverse: > - 1. Usa: "$(grep -i E_JPEG temp.txt)" > Attenzione, non gli apici singoli ('), ma > quelli doppi ("). > - 2. Usa: if grep -iq E_JPEG temp.txt ; then > L'opzione -q dice a grep di non restituire > alcun output, perché verrà > usato solo il suo stato di uscita, che sarà 0 in > caso di successo (stringa > JPEG trovata), che viene visto come valore vero da > if, oppure 1 in caso di > fallimento (stringa JPEG non trovata), che viene > visto come valore falso da if. ok molto chiaro grazie ;) > A prima vista sembra una soluzione logica > controcorrente (0 vero, 1 falso), > ma ha un suo perché: per ogni comando esiste 1 e > sola 1 condizione di > successo, segnalata dallo stato di uscita 0, mentre > possono esserci motivi > diversi di fallimento, segnalati dal valore positivo > dello stato di uscita e > dipendenti dal comando stesso. Generalizzando: 0 è > vero, > 0 è falso. ok bene, mi adeguo pero' il contrario avrebbe avuto senso comunuqe secondo me basta adeguarsi :) > > Adesso passiamo alle ottimizzazioni. > > *Ottimizzazione 1, riga 4* > Perché usare la variabile $PWD? ls usa di default la > directory corrente se > non viene indicato alcun parametro. > Usa: for elemento in $(ls); do si ci pensavo pero' il tutorial che leggevo lo usava e io seguivo quello comunque bene a sapersi :) > > *Ottimizzazione 2, riga 4* > Se vuoi usare come argomenti tutti i file della > directory corrente, non > serve richiedere l'output del comando ls, ma basta > usare l'espansione dei > wildcard. > Usa: for elemento in *; do > molto comodo :) > *Ottimizzazione 3, riga 5* > Non serve controllare che $elemento sia un file > normale, tanto file > restituisce una valore coerente anche per le > directory. > $ file . > .: directory > Semplicemente, verranno ignorate dall'if successivo. vero hai ragione. > *Ottimizzazione 4, riga 6* > file può restituire la codifica mime, quindi un > valore standard, mentre non > è garantito che la stringa restituita di default sia > sempre quella. > Usa: file -i $elemento > temp.txt bene :) > > *Ottimizzazione 5, riga 6 e 7* > Quando possibile, non utilizzare file temporanei. > Sono più lenti che un > accesso alla memoria e vanno gestiti (cancellati > alla fine e in tutte le > varie condizioni di errore ed interruzione). > Inoltre, cosa molto importante, > potrebbe esistere già un file col nome scelto. > Usa: if file $elemento | grep -iq $E_JPEG ; then Inizialmente lo script non usava file temporanei ma il problema e' che non riuscendo ho cercato altri modi per venire a capo del problema :) > > *Ottimizzazione 6, riga 6 e 7* > Anziché cercare una stringa all'interno di un output > di un comando, non > sarebbe molto più comodo e performante controllare > il valore esatto? file > può restituire la codifica mime (ottimizzazione 4) e > può restituire solo quella. > Usa: if [ $(file -bi $elemento) = "image/jpeg" ] ; > then si sono d'accordo .. forse la prossima volta mi leggo meglio il man dei vari programmi che vado ad usare :D > > *Lucidata 1, riga 7* > Se il blocco if contiene un solo comando, a me piace > fare così: > per controllare se la condizione è vera > [ "$(grep -i $E_JPEG temp.txt)" ] && echo > "$elemento e' un jpeg" > per controllare se la condizione è falsa > [ "$(grep -i $E_JPEG temp.txt)" ] || echo > "$elemento non e' un jpeg" > ok > Riassumento: > > #!/bin/bash > E_JPEG=image/jpeg > for elemento in *; do > [ $(file -bi $elemento) = $E_JPEG ] && echo > "$elemento e' un jpeg" > done ;) grazie > > Per il solo esempio riportato, si può anche scrivere > file -Ni * | grep -w image/jpeg | \ > sed "s/\(.*\): image\/jpeg$/\1 e' un jpeg/" O__O ... WOW! Grazie mille per tutte le spiegazioni! __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com ========---------- Archivio delle e-mail postate in lista //www.freelists.org/archives/lugge/ Prima di scrivere in m-list per favore leggi il regolamento http://www.lugge.net/index.php?mod=cosa_facciamo/gruppo_di_discussione Modifica dell'account sulla lista LUGGe http://www.lugge.net/index.php?mod=cosa_facciamo/gruppo_di_discussione#list