Home > database >  Bash function with parameters
Bash function with parameters

Time:06-08

I am trying to understand how to work with functions (that receive a argument) in bash. I did not get my code to work, the following code exemplifies my difficulties:

#!/bin/bash

fruit_code () {
        if [[ "$1" == "apple" ]]; then
                code=1
        else
                code=0
        fi

        return $code
}


for var in apple orange banana apple; do
        code=fruit_code $var
        echo $code
done

The shell (bash) complains saying:

apple: command not found
orange: command not found
banana: command not found
apple: command not found

So it seems the passing of parameters is not working propperly. I can not see where I am going wrong. Any help is very much appreciated. Why does it not work? What changes shoyld I do to make it work? Wish to thank you all in advance.

Kind regards Miguel

CodePudding user response:

The first problem is that if you want to execute a command and capture its output to a variable, you need to use command substitution:

code=$(fruit_code "$var")

The second problem is that your function doesn't write anything to standard output; it returns an exit status. That is automatically assigned to $? after you call the function. Use this instead:

fruit_code "$var"
echo $?

Finally, the convention in shell is for a 0 exit status to indicate success and a non-zero value failure. In this case, your function "succeeds" if the argument is not apple.

CodePudding user response:

You have a syntax error in this line:

code=fruit_code $var

A syntax like this:

foo=bar quux

means that you want to run command quux in an environment where variable foo has value bar.

In your case, quux is $var, so it will take the value of $var and try to run it as a command. That's why you are getting errors saying apple, orange, etc. are not commands.

I think what you actually want is to run fruit_code $var and store the output in variable code, right?

In that case you can use this:

code=$(fruit_code $var)

or this:

code=`fruit_code $var`

I prefer the former because it looks clearer to me and allows easy nesting.

  • Related