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.
Rispondi
tom
Packager
Packager
Messaggi: 407
Iscritto il: dom 1 nov 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

Messaggio da tom »

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 4.x
Linux 4.x
Messaggi: 1027
Iscritto il: ven 16 set 2005, 0:00
Slackware: 14.2 (x64)
Kernel: 4.4.111
Desktop: KDE 4.14.32
Località: Milano
Contatta:

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

Messaggio da boh »

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: 3302
Iscritto il: ven 12 ott 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

Messaggio da Blallo »

Non mi pare sia possibile.

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 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

Messaggio da masalapianta »

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 14 mar 2006, 18:07
Nome Cognome: Rocco Aliberti
Slackware: 14.2-current64
Kernel: 4.14.73
Desktop: awesomeWM
Località: Pinerolo

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

Messaggio da d4z_c0nf »

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 25 lug 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

Messaggio da masalapianta »

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 14 mar 2006, 18:07
Nome Cognome: Rocco Aliberti
Slackware: 14.2-current64
Kernel: 4.14.73
Desktop: awesomeWM
Località: Pinerolo

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

Messaggio da d4z_c0nf »

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

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

Messaggio da targzeta »

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

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 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

Messaggio da ZeroUno »

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 14 mar 2006, 18:07
Nome Cognome: Rocco Aliberti
Slackware: 14.2-current64
Kernel: 4.14.73
Desktop: awesomeWM
Località: Pinerolo

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

Messaggio da d4z_c0nf »

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: 5441
Iscritto il: ven 2 giu 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

Messaggio da ZeroUno »

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

Rispondi