Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bash: pass a function as parameter

I need to pass a function as a parameter in Bash. For example, the following code:

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

Should output:

before Hello world after 

I know eval is not correct in that context but that's just an example :)

Any idea?

like image 345
cd1 Avatar asked Apr 15 '11 04:04

cd1


People also ask

How do you pass a parameter to a function in bash?

To pass any number of arguments to the bash function simply put them right after the function's name, separated by a space.

How do you pass a function as a parameter?

Function Call When calling a function with a function parameter, the value passed must be a pointer to a function. Use the function's name (without parentheses) for this: func(print); would call func , passing the print function to it.

Can we pass function as parameter?

Because functions are objects we can pass them as arguments to other functions. Functions that can accept other functions as arguments are also called higher-order functions. In the example below, a function greet is created which takes a function as an argument.

How do you call a function with arguments in shell script?

To invoke a function, simply use the function name as a command. To pass parameters to the function, add space separated arguments like other commands. The passed parameters can be accessed inside the function using the standard positional variables i.e. $0, $1, $2, $3 etc.


2 Answers

If you don't need anything fancy like delaying the evaluation of the function name or its arguments, you don't need eval:

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

does what you want. You can even pass the function and its arguments this way:

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

prints

before x(): Passed 1st and 2nd after 
like image 179
Idelic Avatar answered Oct 13 '22 19:10

Idelic


I don't think anyone quite answered the question. He didn't ask if he could echo strings in order. Rather the author of the question wants to know if he can simulate function pointer behavior.

There are a couple of answers that are much like what I'd do, and I want to expand it with another example.

From the author:

function x() {   echo "Hello world" }  function around() {   echo "before"   ($1)                   <------ Only change   echo "after" }  around x 

To expand this, we will have function x echo "Hello world:$1" to show when the function execution really occurs. We will pass a string that is the name of the function "x":

function x() {   echo "Hello world:$1" }  function around() {   echo "before"   ($1 HERE)                   <------ Only change   echo "after" }  around x 

To describe this, the string "x" is passed to the function around() which echos "before", calls the function x (via the variable $1, the first parameter passed to around) passing the argument "HERE", finally echos after.

As another aside, this is the methodology to use variables as function names. The variables actually hold the string that is the name of the function and ($variable arg1 arg2 ...) calls the function passing the arguments. See below:

function x(){     echo $3 $1 $2      <== just rearrange the order of passed params }  Z="x"        # or just Z=x  ($Z  10 20 30) 

gives: 30 10 20, where we executed the function named "x" stored in variable Z and passed parameters 10 20 and 30.

Above where we reference functions by assigning variable names to the functions so we can use the variable in place of actually knowing the function name (which is similar to what you might do in a very classic function pointer situation in c for generalizing program flow but pre-selecting the function calls you will be making based on command line arguments).

In bash these are not function pointers, but variables that refer to names of functions that you later use.

like image 34
uDude Avatar answered Oct 13 '22 18:10

uDude