|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2004
Città: TREVISO
Messaggi: 902
|
bash-ta!!!
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: Codice:
#!/bin/bash
pattern=$2
list=$(ls)
cmd=$1
for file in $list; do
case $file in
$pattern)
echo "esecuzione comando"
$cmd $file;;
esac
done
(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.......
__________________
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
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ì: Codice:
#!/bin/bash
cmd=$1
shift
list=$*
for file in $list; do
$cmd $file
done
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2004
Città: TREVISO
Messaggi: 902
|
....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.....
__________________
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
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*"
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Feb 2004
Città: TREVISO
Messaggi: 902
|
....per evitare che faccia l'espansione....grazie ancora....
.............due monumenti allora..............
__________________
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:20.


















