View previous topic :: View next topic |
Author |
Message |
silian87 Advocate
Joined: 06 Oct 2003 Posts: 2318 Location: Treviso, Italy
|
Posted: Fri Jul 09, 2004 10:11 pm Post subject: [DEV] Richiamare delle funzioni di uno script dall'esterno |
|
|
Avrei bisigno per un programma di backup che sto sviluppando si fare un file.sh che contenesse tutte le funzioni, ed uno con il main. Volevo richiamare le funzioni bash in stile runscript, come facciamo per avviare un demone e cioe':
Code: | /etc/init.d/ssh start | /etc/init.d/ssh e' il file sh e start e' una funzione. Purtroppo non funziona con script che usano bash (#!/bin/bash). Infatti i demoni usano runsript (/sbin/runscript). Ho aperto l'sh di runscript, ma credo che l'interprete che richiama le funzioni sia nel file sorgente C di /sbin/runscript. Volevo sapere se qualcuno sa come invocare, quindi, una funzione di uno script all'esterno di esso, magari passando la funzione come argomnto "$1" o "$2". Grazie. _________________ Musica che ascolto: http://www.last.fm/user/silian87/
Silian87 FAQs: http://marentax.homelinux.org/~silian87/silian87-faq.txt
GTalk: silian87@gmail.com |
|
Back to top |
|
|
FonderiaDigitale Veteran
Joined: 06 Nov 2003 Posts: 1710 Location: Rome, Italy
|
Posted: Fri Jul 09, 2004 10:42 pm Post subject: |
|
|
e' veramente una stupidata.
ti faccio un veloce excursus di cosa potrebbe servirsi:
in bash, le variabili passate da riga di comando:
Code: | $0 = percorso completo del file eseguito es. /usr/bin/ciccio.sh
`basename $0`= lo script di per se stesso, es. ciccio.sh
$1 $2 $3 ... $n = i parametri passati allo script in ordine sequenziale
$@ = l'insieme di tutti i parametri passati
|
ricorda che in bash, salvo espressamente indicato, lo spazio e' un separatore di variabili, o array.
per fare un parsing di parametri da riga di comando, usa qualcosa di questo tipo:
Code: |
#!/bin/sh
case $@ in
-p|--pippo)
echo "hai selezionato pippo"
shift
;;
-m|--mamma)
shift
opzione_di_mamma=$1
echo "hai selezionato mamma con opzione $opzione_di_mamma"
shift
;;
-b|--babbo)
echo "hai selezionato babbo"
shift
;;
*) echo "tutto il resto"
;;
esac
|
questo e' quello che faccio io di solito, ovvero includo sia la forma breve che quella lunga della opzione.
non ti conviene usare un ciclo di while o for, poiche' alcuni parametri richiedono una variabile a volte (Es. --debug 4)
shift va avanti col parsing di una posizione (leggi:passa avanti al prossimo)
quindi potresti fare una cosa tipo:
Code: | #!/bin/sh
func_start () {
echo "parto"
}
func_stop ()
echo "mi stoppo"
exit 0
}
func_help () {
echo "Abbello, devi darmi un'azione da fare"
exit 1
}
case $1 in
start) func_start
;;
stop) func_stop
;;
*) func_help
;;
esac
|
_________________ Come disse un amico, i sistemisti sono un po' come gli artigiani per l'informatica
|
|
Back to top |
|
|
silian87 Advocate
Joined: 06 Oct 2003 Posts: 2318 Location: Treviso, Italy
|
Posted: Sat Jul 10, 2004 7:44 am Post subject: |
|
|
mm grazie.. adesso ho capito che non era complicato...
pero' io mettero' molte funzioni... non si puo' fare che il parametro che io li do fa partire direttamente la funzione con lo stesso nome? Credo che in fondo il runscript faccia qualcosa del genere.
tipo io li do: Code: | nomescript.sh funzione |
E lui ha del codice che fa immeditamente
In questo modo e' vero che se sbaglio parametro mi da un errorre, pero' c'e' molto meno codice, e poi io questo script non lo devo usare come interfaccia utente, sara' un altro script ad usarlo.
In alternativa non e' possibile fare uno script esterno che faccia questo compito di rischiamare le funzioni di un'akltro?
P.S.: Ieri ho imparato il comando source!!! Prima stavo gia' pensando di usare awk o grep per prendermi i parametri di configurazione! _________________ Musica che ascolto: http://www.last.fm/user/silian87/
Silian87 FAQs: http://marentax.homelinux.org/~silian87/silian87-faq.txt
GTalk: silian87@gmail.com |
|
Back to top |
|
|
FonderiaDigitale Veteran
Joined: 06 Nov 2003 Posts: 1710 Location: Rome, Italy
|
Posted: Sat Jul 10, 2004 11:37 am Post subject: |
|
|
basta che dichiari le funzioni con lo stesso nome dei comandi che vuoi dare, e poi
Code: |
#!/bin/sh
start () {
....
}
# esegue la funzione
$1
|
_________________ Come disse un amico, i sistemisti sono un po' come gli artigiani per l'informatica
|
|
Back to top |
|
|
Cagnulein l33t
Joined: 18 Sep 2003 Posts: 861 Location: Modena, Italy
|
Posted: Sat Jul 10, 2004 5:45 pm Post subject: |
|
|
Code: | -m|--mamma)
shift
opzione_di_mamma=$1
echo "hai selezionato mamma con opzione $opzione_di_mamma"
shift |
possibile che questo case non mi funzioni? non viene valorizzato il $1...ho usato esattamente il tuo script |
|
Back to top |
|
|
FonderiaDigitale Veteran
Joined: 06 Nov 2003 Posts: 1710 Location: Rome, Italy
|
Posted: Sat Jul 10, 2004 7:47 pm Post subject: |
|
|
fammi vedere lo script e come lo lanci _________________ Come disse un amico, i sistemisti sono un po' come gli artigiani per l'informatica
|
|
Back to top |
|
|
Cagnulein l33t
Joined: 18 Sep 2003 Posts: 861 Location: Modena, Italy
|
Posted: Sun Jul 11, 2004 9:58 am Post subject: |
|
|
ecco qui il risultato:
Code: |
bash-2.05b$ ./prova --mamma 40
tutto il resto
bash-2.05b$ ./prova -m 40
tutto il resto
bash-2.05b$ ./prova -m
hai selezionato mamma con opzione
bash-2.05b$ ./prova --mamma
hai selezionato mamma con opzione |
lo script è il tuo, ho fatto copia incolla e basta, cmq eccolo:
Code: | #!/bin/sh
case $@ in
-p|--pippo)
echo "hai selezionato pippo"
shift
;;
-m|--mamma)
shift
opzione_di_mamma=$1
echo "hai selezionato mamma con opzione $opzione_di_mamma"
shift
;;
-b|--babbo)
echo "hai selezionato babbo"
shift
;;
*) echo "tutto il resto"
;;
esac |
|
|
Back to top |
|
|
FonderiaDigitale Veteran
Joined: 06 Nov 2003 Posts: 1710 Location: Rome, Italy
|
Posted: Sun Jul 11, 2004 12:12 pm Post subject: |
|
|
mea culpa. ho scritto troppo in velocita' senza testare il codice
Code: |
#!/bin/sh
while [ -n "$1" ]
do
case "$1" in
-p|--pippo)
echo "hai selezionato pippo"
;;
-m|--mamma)
shift
[ -z "$1" ] && echo "introduci un parametro";exit
opzione_di_mamma=$1
echo "hai selezionato mamma con opzione $opzione_di_mamma"
;;
-b|--babbo)
echo "hai selezionato babbo"
;;
*) echo "tutto il resto"
;;
esac
shift
done
|
_________________ Come disse un amico, i sistemisti sono un po' come gli artigiani per l'informatica
|
|
Back to top |
|
|
silian87 Advocate
Joined: 06 Oct 2003 Posts: 2318 Location: Treviso, Italy
|
|
Back to top |
|
|
|