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 in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
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 della regola 5 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 19: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 12: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 » dom ott 30, 2011 23: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: 953
Iscritto il: gio set 15, 2005 23:00
Località: Milano
Slackware: 14.1 (x64)
Kernel: 3.14.1
Desktop: KDE 4.13.3

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

Messaggioda Blallo » lun ott 31, 2011 1:55

Non mi pare sia possibile.
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3234
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

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

Messaggioda masalapianta » lun ott 31, 2011 8: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: 2775
Iscritto il: dom lug 24, 2005 23: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 10: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: 1293
Iscritto il: mar mar 14, 2006 18:07
Località: Salerno
Nome Cognome: Rocco Aliberti
Slackware: 14.1-64bit
Kernel: 3.10.17
Desktop: xfce

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

Messaggioda masalapianta » lun ott 31, 2011 10: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: 2775
Iscritto il: dom lug 24, 2005 23: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: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: 1293
Iscritto il: mar mar 14, 2006 18:07
Località: Salerno
Nome Cognome: Rocco Aliberti
Slackware: 14.1-64bit
Kernel: 3.10.17
Desktop: xfce

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

Messaggioda targzeta » lun ott 31, 2011 18: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
Linux Registered User #454438
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: 6186
Iscritto il: gio nov 03, 2005 14: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 0: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
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
Avatar utente
ZeroUno
Staff
Staff
 
Messaggi: 4412
Iscritto il: ven giu 02, 2006 13:52
Località: Roma / Castelli
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current

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

Messaggioda d4z_c0nf » gio nov 03, 2011 0: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: 1293
Iscritto il: mar mar 14, 2006 18:07
Località: Salerno
Nome Cognome: Rocco Aliberti
Slackware: 14.1-64bit
Kernel: 3.10.17
Desktop: xfce

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

Messaggioda ZeroUno » gio nov 03, 2011 16: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.
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
Avatar utente
ZeroUno
Staff
Staff
 
Messaggi: 4412
Iscritto il: ven giu 02, 2006 13:52
Località: Roma / Castelli
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Google [Bot] e 1 ospite