Purtroppo mi trovo ad affrontare un progetto dell'uni in bash scripting non avendolo studiato granchè e avendo o due dispensine striminzite del prof.. o pdf in inglese di 500 pagine.. e siccome ho 10 giorni scarsi.. ogni tanto mi trovo a chiedere aiuto anche per cose medio/banali (dopo averci sbattuto un po' la testa ) ^_^

Il progetto: devo emulare la funzione rsync SOLO nel funzionamento locale (da una dir all'altra) e con alcuni parametri

Il problema specifico: il problema specifico è che devo copiare file per file perchè devo discriminare la copia di ogni singolo file a seconda di alcuni flag. Ma questo non vi interessa se non per dovere di cronaca.

Il punto è che ho problemi ad implementare la (mutua) ricorsione quando devo copiare una directory con il suo contenuto

semplifico all'osso il codice.. la funzione principale è start_copy che riceve dal main una lista di file in cui i primi (di numero imprecisato) sono sorgenti e l'ultimo è la directory di destinazione.

codice:
start_copy() {
        dest=${!#} #l'ultimo parametro è la destinazione

	for file in $* #ciclo su tutti i parametri 
	do
                #esco dal ciclo quando arrivo all'ultimo
                #parametro che è uguale alla destinazion
		if [ $file == $dest ]
			then break
		fi

                #dopo vari controlli arrivo al punto
                #in cui devo copiare
		if [ -d $file ]
			then copy_dir $file $dest
			else copy $file $dest
		fi			
	done
}

copy() {
#dopo vari controlli copia, se necessario, così
cp $1 $2/`basename $1`
}

copy_dir() {
#dopo vari controlli arrivo qui
mkdir $2/`basename $1` #crea la dir

#faccio la chiamata ricorsiva passando il contenuto della
#dir che sto copiando
start_copy "`ls -x $1` $2/`basename $1`"
}
Ora.. dopo mille problemi sono arrivato a questo punto.. che dovrebbe funzionare... ma il problema è che alla seconda chiamata di start_copy (quando a chiamarla è copy_dir) come ultimo parametro (${!#}) mi trovo l'intera lista di parametri e non solo l'ultimo (la destinazione corrente) come mi aspetterei...

in più mi va in loop... probabilmente proprio per questo errore

qualcuno è così paziente da aiutarmi a capire dove cacchio sbaglio?

tnx