Repository 32bit  Forum
Repository 64bit  Wiki

BASH: creare funzioni il cui nome è una variabile

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza dell'ultima regola porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

BASH: creare funzioni il cui nome è una variabile

Messaggioda tom » dom ott 30, 2011 20:00

Salve a tutti, vorrei rendere questo codice
Codice: Seleziona tutto
tizio(){
  serie di comandi tizio
}
caio(){
  serie di comandi caio
}
sempronio(){
  serie di comandi sempronio
}

in qualcosa di più elegante, tipo questo
Codice: Seleziona tutto
for i in tizio caio sempronio ; do
  $i(){
    serie di comandi $i
  }
done

solo che a quanto pare in bash non è possibile fare ciò, o comunque la sintassi non parrebbe corretta. Come posso creare funzioni il cui nome sia una variabile?
tom
Packager
Packager
 
Messaggi: 407
Iscritto il: dom nov 01, 2009 13:53
Nome Cognome: Tommaso D'Anna
Slackware: 13.37
Kernel: 2.6.37.6
Desktop: xfce

Re: BASH: creare funzioni il cui nome è una variabile

Messaggioda boh » lun ott 31, 2011 0:59

Istintivamente ti direi di usare un vettore di puntatori a funzione, ma non so se il bash li supporta (non lo conosco molto).
"Be yourself. Everyone else is already taken." ~ Oscar Wilde
Avatar utente
boh
Linux 2.6
Linux 2.6
 
Messaggi: 746
Iscritto il: ven set 16, 2005 0:00
Località: Milano.
Slackware: 14 (x64)
Kernel: 3.2.45-smp
Desktop: KDE 4.10.3

Re: BASH: creare funzioni il cui nome è una variabile

Messaggioda Blallo » lun ott 31, 2011 2:55

Non mi pare sia possibile.
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3054
Iscritto il: ven ott 12, 2007 11:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14 x64 / 12.2
Kernel: 3.2.x
Desktop: Xfce

Re: BASH: creare funzioni il cui nome è una variabile

Messaggioda masalapianta » lun ott 31, 2011 9:20

non è possibile ma puoi utilizzare eval per fare qualcosa di simile:
Codice: Seleziona tutto
#!/bin/bash

abc()
{
        echo aaa
}

def()
{
        echo bbb
}

for i in abc def; do
        eval $i
done

Avatar utente
masalapianta
Iper Master
Iper Master
 
Messaggi: 2363
Iscritto il: lun lug 25, 2005 0:00
Località: Roma
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian

Re: BASH: creare funzioni il cui nome è una variabile

Messaggioda d4z_c0nf » lun ott 31, 2011 11:29

masalapianta ha scritto:non è possibile ma puoi utilizzare eval per fare qualcosa di simile:
Codice: Seleziona tutto
#!/bin/bash

abc()
{
        echo aaa
}

def()
{
        echo bbb
}

for i in abc def; do
        eval $i
done



perchè scusa, facendo solo:
Codice: Seleziona tutto

for i in abc def; do
       $i
done


non ottieni lo stesso risultato?
Avatar utente
d4z_c0nf
Packager
Packager
 
Messaggi: 1266
Iscritto il: mar mar 14, 2006 19:07
Località: Salerno
Nome Cognome: Rocco Aliberti
Slackware: current64
Kernel: 3.2.13
Desktop: awesome 3.4.11

Re: BASH: creare funzioni il cui nome è una variabile

Messaggioda masalapianta » lun ott 31, 2011 11:59

d4z_c0nf ha scritto:perchè scusa, facendo solo:
Codice: Seleziona tutto

for i in abc def; do
       $i
done


non ottieni lo stesso risultato?

è vero, fa implicitamente l'eval della variabile; strano, son quasi sicuro che fino a qualche anno fa non funzionasse, o nel frattempo hanno modificato qualcosa o mi son rincoglionito io (da non escludere)
Avatar utente
masalapianta
Iper Master
Iper Master
 
Messaggi: 2363
Iscritto il: lun lug 25, 2005 0:00
Località: Roma
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian

Re: BASH: creare funzioni il cui nome è una variabile

Messaggioda d4z_c0nf » lun ott 31, 2011 12:14

masalapianta ha scritto:
d4z_c0nf ha scritto:perchè scusa, facendo solo:
Codice: Seleziona tutto

for i in abc def; do
       $i
done


non ottieni lo stesso risultato?

è vero, fa implicitamente l'eval della variabile; strano, son quasi sicuro che fino a qualche anno fa non funzionasse, o nel frattempo hanno modificato qualcosa o mi son rincoglionito io (da non escludere)


Eheh.
A questo punto però mi viene il dubbio che tom chiedesse un'altra cosa, o forse semplicemente non aveva provato.
Bah
Avatar utente
d4z_c0nf
Packager
Packager
 
Messaggi: 1266
Iscritto il: mar mar 14, 2006 19:07
Località: Salerno
Nome Cognome: Rocco Aliberti
Slackware: current64
Kernel: 3.2.13
Desktop: awesome 3.4.11

Re: BASH: creare funzioni il cui nome è una variabile

Messaggioda targzeta » lun ott 31, 2011 19:25

d4z_c0nf ha scritto:..A questo punto però mi viene il dubbio che tom chiedesse un'altra cosa...
anche io ho capito che chiedesse un'altra cosa. Ma secondo me chiede qualcosa di sbagliato a livello concettuale. Aspettiamo delucidazioni.

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 5914
Iscritto il: gio nov 03, 2005 15:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: BASH: creare funzioni il cui nome è una variabile

Messaggioda ZeroUno » gio nov 03, 2011 1:35

d4z_c0nf ha scritto:perchè scusa, facendo solo:
Codice: Seleziona tutto

for i in abc def; do
       $i
done


non ottieni lo stesso risultato?

Dipende
Codice: Seleziona tutto
$ touch "a a" x pippo
for a in "ls \"a a\"" "ls x" "ls pippo";do $a;done
for a in "ls \"a a\"" "ls x" "ls pippo";do eval $a;done



http://fvue.nl/wiki/Bash:_Why_use_eval_ ... pansion%3F
My packages&files searcher: http://slakfinder.org | My repository for slackware64-current: http://www.z01.eu/repo-slack
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
Avatar utente
ZeroUno
Staff
Staff
 
Messaggi: 3778
Iscritto il: ven giu 02, 2006 14:52
Località: Roma / Castelli
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: slack-current
Distribuzione: 01000000-current

Re: BASH: creare funzioni il cui nome è una variabile

Messaggioda d4z_c0nf » gio nov 03, 2011 1:52

ZeroUno ha scritto:
d4z_c0nf ha scritto:perchè scusa, facendo solo:
Codice: Seleziona tutto

for i in abc def; do
       $i
done


non ottieni lo stesso risultato?

Dipende
Codice: Seleziona tutto
$ touch "a a" x pippo
for a in "ls \"a a\"" "ls x" "ls pippo";do $a;done
for a in "ls \"a a\"" "ls x" "ls pippo";do eval $a;done



http://fvue.nl/wiki/Bash:_Why_use_eval_ ... pansion%3F


Non dicevo mica che sono la stessa cosa, dicevo solo che nel caso specifico ottieni lo stesso risultato.
Avatar utente
d4z_c0nf
Packager
Packager
 
Messaggi: 1266
Iscritto il: mar mar 14, 2006 19:07
Località: Salerno
Nome Cognome: Rocco Aliberti
Slackware: current64
Kernel: 3.2.13
Desktop: awesome 3.4.11

Re: BASH: creare funzioni il cui nome è una variabile

Messaggioda ZeroUno » gio nov 03, 2011 17:39

d4z_c0nf ha scritto:Non dicevo mica che sono la stessa cosa, dicevo solo che nel caso specifico ottieni lo stesso risultato.

indubbiamente nel caso specifico ottieni lo stesso risultato :-)
personalmente non ho mai utilizzato eval.
My packages&files searcher: http://slakfinder.org | My repository for slackware64-current: http://www.z01.eu/repo-slack
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
Avatar utente
ZeroUno
Staff
Staff
 
Messaggi: 3778
Iscritto il: ven giu 02, 2006 14:52
Località: Roma / Castelli
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: slack-current
Distribuzione: 01000000-current


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite