La función Bash asigna valor al parámetro pasado

La función Bash asigna valor al parámetro pasado

Tengo la siguiente situación:

Estoy escribiendo un script que leerá sus parámetros desde un archivo de configuración (si existe y el parámetro está presente) o le pedirá al usuario que ingrese dicho parámetro si no está presente.

Como estoy haciendo esto para unos cuantos parámetros, pensé que escribir una función sería el camino a seguir.

Sin embargo, hasta donde yo lo entiendo, la función devuelve el valor del resultado al echoejecutarlo o asignándolo a una variable global. Sin embargo, quiero hacer eco en la pantalla de la función, por lo que tendrá que ser la opción dos. Entonces probé esto:

# 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
}

Yo lo llamo así:

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

El config.cfgarchivo se sourceanaliza antes de llamar a la función y $database_usernamees uno de los parámetros opcionales allí.

Ahora bien, esto obviamente no funciona. No puedo asignar $3y como quiero que el método sea genérico, tampoco puedo hacerlo MY_VARIABLE=$parameter.

¿Alguien tiene alguna sugerencia sobre cómo puedo lograr todo lo siguiente?

  1. Obtenga el valor de la variable de cualquiera config.cfgo léalo de la entrada del usuario
  2. Haga esto de forma genérica, es decir, no repita el código anterior (sin una función) para cada parámetro.

Respuesta1

No estoy 100% seguro de haberlo seguido, pero digamos que un configarchivo se ve así:

foo
database_user tom
bar

El valor obvio que queremos es el de database_user.

En un script simplemente podrías poner una línea como esta:

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

Entonces la variable $dbUsercontendrá esta información:

echo $dbUser 
tom

Respuesta2

Muy bien, parece que resolví mi propio problema:

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
}

Al usarlo, echo -ppude mostrar un mensaje en la consola y aún poder devolver una cadena de la función usando regular echo. De esa manera, al llamar a la función database_username=$(getParameter ...)puedo asignarla a una variable.

información relacionada