1

I've got the following situation:

I'm writing a script that will read its parameters either from a config file (if exists and parameter present) or asks the user to input said parameter if it's not present.

Since I'm doing this for a handful of parameters I thought writing a function would be the way to go.

However, as far as I understand it, the function returns the result value by echoing it or by assigning it to a global variable. I do want to echo to the screen in the function though, so it'll have to be option two. So i tried this:

# parameters: $1=name of parameter, $2=user prompt, $3=value read from config.cfg
function getParameter {
    # If the value couldn't be read from the config file
    if [ -z "$3" ]; then
        # Echo the prompt
        echo "$2"
        # Read the user input
        read parameter

        # If it's empty, fail
        if [ -z "$parameter" ]; then
            echo "Parameter $1 not found"
            exit
        # Else, try to assign it to $3   <---- This is where it fails
        else
            $3="$parameter"
        fi
    fi
}

I call it like this:

getParameter "Database username" "Please enter database username" $database_username

The config.cfg file is sourced before the function is called and $database_username is one of the optional parameters there.

Now this obviously doesn't work. I can't assign to $3 and since I want the method to be generic, I can't do MY_VARIABLE=$parameter either.

Does anyone have any suggestions how I can achieve all of the below:

  1. Get variable value from either config.cfg or read it from the user input
  2. Do this in a generic fashion, i.e. don't repeat the above code (without a function) for each parameter

2 Answers 2

0

Not 100% sure that I follow, but let's say a config file looks like this:

foo
database_user tom
bar

The obvius value we want is that of database_user.

In a script you could simply put a line like this:

dbUser=$(sed -nE 's/database_user (.*$)/\1/p' config)

Then the variable $dbUser will contain this information:

echo $dbUser 
tom
1
  • Yes, I get the values with source. That's all working fine. What I need is to ask the user for the value if it's not in the file. And ideally this should be genetic so that I can do it for multiple parameters
    – Baz
    Nov 2, 2016 at 18:21
0

Alright, looks like I solved my own problem:

function getParameter {
    if [ -z "$3" ]; then
        # User read -p to show a prompt rather than using echo for this
        read -p "$2`echo $'\n> '`" parameter

        # Print to sdterr and return 1 to indicate failure
        if [ -z "$parameter" ]; then
            >&2 echo "Parameter $1 not found"
            return 1
        else
            echo $parameter
        fi
    else
        echo $3
    fi
}

By using echo -p I was able to show a prompt on the console and still be able to return a string from the function by using regular echo. That way, by calling the function with database_username=$(getParameter ...) I can assign it to a variable.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .