103 votes

Bash : passer une fonction comme paramètre

J'ai besoin de passer une fonction comme paramètre dans Bash. Par exemple, le code suivant :

function x() {
  echo "Hello world"
}

function around() {
  echo "before"
  eval $1
  echo "after"
}

around x

Si la sortie :

before
Hello world
after

Je sais que eval n'est pas correct dans ce contexte, mais ce n'est qu'un exemple :)

Une idée ?

147voto

Idelic Points 4196

Si vous n'avez pas besoin de quoi que ce soit comme retarder l'évaluation du nom de la fonction ou de ses arguments, vous n'avez pas besoin de eval :

function x()      { echo "Hello world";          }
function around() { echo before; $1; echo after; }

around x

fait ce que vous voulez. Vous pouvez même passer la fonction et ses arguments de cette façon :

function x()      { echo "x(): Passed $1 and $2";  }
function around() { echo before; "$@"; echo after; }

around x 1st 2nd

impressions

before
x(): Passed 1st and 2nd
after

19voto

kurumi Points 10096

il n'est pas nécessaire d'utiliser eval

function x() {
  echo "Hello world"
}

function around() {
  echo "before"
  var=$($1)
  echo "after $var"
}

around x

2voto

Anand Thangappan Points 1574

Une meilleure approche consiste à utiliser des variables locales dans vos fonctions. Le problème devient alors la façon dont vous obtenez le résultat à l'appelant. Un mécanisme est d'utiliser la substitution de commande :

function myfunc()
{
    local  myresult='some value'
    echo "$myresult"
}

result=$(myfunc)   # or result=`myfunc`
echo $result

Ici, le résultat est envoyé à la sortie stdout et l'appelant utilise la substitution de commande pour capturer la valeur dans une variable. La variable peut ensuite être utilisée selon les besoins.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X