Newsgroup: it.comp.os.linux.development
Titolo: [BASH] problemi di espansione :(

Hi All,
	premetto che ho già cercato su Google, Appunti Linux, man bash, e varie
altre pagine e HOWTO relativi a Bash, ma non ho ancora risolto questo
problema.
Sto creando una serie di script per convertire cd in ogg/mp3. So già che
ce ne sono parecchi in giro, ma io voglio farne alcuni per mie esigenze, e
poi adesso è diventata una questione di principio :)
Il problema è questo. Vorrei passare al mio script delle opzioni e *.ext
dove ext è l'estensione dei file (wav,ogg,mp3, etc...).
Quindi la sintassi dovrebbe essere qualcosa del tipo:
mioscript [options] *.ext
Non posto tutto lo script, ma un esempio di una funzione che funziona solo
se i nomi dei file non contengono spazi.
#!/bin/sh
function ecomp3 {
 for i in $files ;
  do
  filename=`echo "$i" | cut -d . -f 1`
  echo "$1/$filename"  
 done
}
#la funzione *funziona* se i nomi che passo dei file non contengono spazi
#altrimenti il ciclo for interpreta la varibile i come, per esempio:
#
#i=01
#i=-
#i=filename
# etc...
optn=$1;shift
#qui prendo $1 e shifto perchè *.wav per esempio viene interpretato come
#track01.wav track02.wav ... trackXX.wav
files=$*
#in files mi ritrovo una stringa con i nomi dei file
case $optn in
  -h) printf "$helptext"
      shift;;
  -s) ecomp3;;  
  -a) funzione_a;;
  -b) funzione_b;;
   *) printf "$helptext"
 esac
 exit 1
fi
non so se sono riuscito a spiegarmi, ma vorrei un ciclo for
del tipo
for i in $ext do
 funzione
done
dove $ext assume di volta in volta il valore *.ext passato come parametro.
Non so se quello che sto facendo sia giusto, e se ci sono altre soluzioni
(in bash) più pulite, fatemi sapere. 
Grazie (spero di non essere OT).

 dove $ext assume di volta in volta il valore *.ext passato come parametro.
Non usare $*, usa "$@".
    bard@prism:~$ cycle() { for ext in "$@"; do echo $ext; done; }
    bard@prism:~$ cycle "one two three" "four five six"
    one two three
    four five six
Adv-Bash-Scripting-Guide per approfondimenti.
-- 
"We should not be looking for the tools that novices can safely use.
We should be looking to increase the skill of those novices so that
they can safely use the power tools that will get the real work
done."            (Robert Martin on the Pragmatic Programmer's mailing list)

 Adv-Bash-Scripting-Guide per approfondimenti.
Ti assicuro che la sto leggendo da una settimana, e non essendo riuscito a
venirne a capo da solo, ho chiesto aiuto qui.

 venirne a capo da solo, ho chiesto aiuto qui.
Intendevo darti un'indicazione utile nel caso non la conoscessi, non
un RTFM, sia chiaro.


 done
Finchè è così, va bene, ma con la funzione?
Il mio problema è che nel momento in cui creo una funzione e gli devo
passare dir e files, il "$@":
1) o non funziona
2) o sono io incapace (+ probabile :) )
3) o c'è sicuramente un altro modo per farlo

 Non funziona :( Dove sbaglio?
Guarda se questo va:
#!/bin/sh
function ecomp3 {
 echo "$2" | while read i; do
  filename=`echo "$i" | cut -d . -f 1` 
  echo "$1/$i.mp3"
 
 done
}
optn=$1;shift
echo -e "L'opzione che hai dato è: $optn \n "
files=`ls $@`
echo -e "I file su cui agirà lo script sono: $files \n "
echo -e "Output: \n"
ecomp3 mp3_high "$files"
$ ls -1
b c
d
$ try.sh a "*"
L'opzione che hai dato è: a 
 
I file su cui agirà lo script sono: b c
d 
 
Output: 
mp3_high/b c.mp3
mp3_high/d.mp3
Nota l'uso degli apici, servono per conservare i vari CR...
Inoltre il "for" non funge se l'argomento include dei nomi con
spazi. Bisogna usare un while.
Ciao,
-- 
       Roberto Divia`             Love at first sight is one of the greatest
       =============             labour-saving devices the world has ever seen.
Mailbox: C02110                 CERN-European Organization for Nuclear Research
E-mail: 
Robert...@cern.ch
           CH-1211 GENEVE 23, Switzerland

Sooner or later you have to use the command line. M$-windows is still far ahead
No, it's far behind, as it basically doesn't have a usable command line, but in
Linux you are tempted by it's power all the time until you give up and take the
red pill. :)                (Aigars Mahinovs on debian-knoppix mailing list)

 funzione al cui interno eseguire il ciclo?
Volevo fare alcune funzioni, ed in base alle opzioni date da prompt, far
fare diverse cose allo script. Tutto li.
Cmq ho deciso di non utilizzare le funzioni, perchè ho meno problemi nel
gestire i parametri. Grazie mille per l'aiuto.

 spazi. Bisogna usare un while.
Questo non lo sapevo. Però lo script di Massimiliano Mirra funziona anche
con gli spazi.
Cmq ora ho risolto, evito le funzioni, ho meno problemi, tanto lo script è
semplice.