PDA

View Full Version : bash-ta!!!


akyra
01-07-2004, 16:55
sto facendo uno script in bash che dovrebbe fare quanto segue:

l'utente chiama lo script con "nomescript.sh rm pattern" ed esegue rm su tutti i file della dir corrente che hanno una corrispondenza con "pattern".
Niente di trascendentale, soltanto che la cosa (tanto per cambiare) non funzia come dico io. il codice è il seguente:


#!/bin/bash

pattern=$2
list=$(ls)
cmd=$1

for file in $list; do
case $file in
$pattern)
echo "esecuzione comando"
$cmd $file;;
esac
done


il problema è che, se ho due file che si chiamano, ad es., "pippo" e "pippa"
(non mi venivano altri nomi...) l'esecuzioni di

script.sh rm p*

(dove p* è appunto il pattern) mi elimina solo il file "pippa", e non il file "pippo"...pechè?!!?!?!?! (.....serie di convulsioni facciali....)
da quanto ne so, il ciclo for dovrebbe attribuire di volta in volta un nuovo elemento alla variabile $file di quelli presenti in $list (che contiene la lista dei file presenti nella directory), e ciò accade regolarmente...ma allora perchè non esegue "rm" su tutti i file, ma solo sul primo che incontra?
(infatti se rieseguo lo script una volta che il file "pippa" è già stato eliminato, allora mi elimina anche "pippo")...
qualcuno m'aiuti....sigh.......

ilsensine
01-07-2004, 17:14
Perché Bash espande il pattern per te, e mette i match in $2, $3, ...quindi il _tuo_ $2 corrisponde già al primo match trovato, non alla stringa "pippo*"!
Puoi fare così:

#!/bin/bash
cmd=$1
shift
list=$*
for file in $list; do
$cmd $file
done

akyra
01-07-2004, 17:25
....aaaaaah...quindi quando eseguo l'assegnazione

pattern=$1

non assegna effettivamente il modello alla variabile pattern, ma gli assegna il primo match che riesce a trovare (quindi "pippa" in tal caso)...
perciò non c'è modo affinchè assegni alla variabile $pattern il modello, se non usare lo shift, per far sì che venga attribuita con list=$* la lista di tutti i file (che fanno il match col pattern), da scadire poi col ciclo for...giusto?
....prima o poi ti faccio un monumento.....:)

ilsensine
01-07-2004, 17:27
Sì c'è un modo, devi mettere in escape il carattere jolly. Così il tuo script funziona:
script.sh rm p\*
oppure:
script.sh rm "p*"

akyra
01-07-2004, 17:31
....per evitare che faccia l'espansione....grazie ancora....

.............due monumenti allora..............:)