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.
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

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?

Avatar utente
boh
Linux 3.x
Linux 3.x
Messaggi: 1021
Iscritto il: ven set 16, 2005 0:00
Slackware: 14.2 (x64)
Kernel: 4.4.19
Desktop: KDE 4.14.21
Località: Milano
Contatta:

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
Blallo
Packager
Packager
Messaggi: 3287
Iscritto il: ven ott 12, 2007 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

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

Messaggioda Blallo » lun ott 31, 2011 1:55

Non mi pare sia possibile.
My DWM configuration: https://github.com/8lall0/dwm

Feel free to use.

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

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
d4z_c0nf
Packager
Packager
Messaggi: 1296
Iscritto il: mar mar 14, 2006 18:07
Nome Cognome: Rocco Aliberti
Slackware: 14.1-64bit
Kernel: 3.10.17
Desktop: xfce
Località: Salerno

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
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun lug 25, 2005 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

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
d4z_c0nf
Packager
Packager
Messaggi: 1296
Iscritto il: mar mar 14, 2006 18:07
Nome Cognome: Rocco Aliberti
Slackware: 14.1-64bit
Kernel: 3.10.17
Desktop: xfce
Località: Salerno

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
targzeta
Iper Master
Iper Master
Messaggi: 6415
Iscritto il: gio nov 03, 2005 14:05
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

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
ZeroUno
Staff
Staff
Messaggi: 4948
Iscritto il: ven giu 02, 2006 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

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
d4z_c0nf
Packager
Packager
Messaggi: 1296
Iscritto il: mar mar 14, 2006 18:07
Nome Cognome: Rocco Aliberti
Slackware: 14.1-64bit
Kernel: 3.10.17
Desktop: xfce
Località: Salerno

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
ZeroUno
Staff
Staff
Messaggi: 4948
Iscritto il: ven giu 02, 2006 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

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


Torna a “Programmazione”

Chi c’è in linea

Visitano il forum: Google [Bot] e 4 ospiti