
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 echo
ejecutarlo 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.cfg
archivo se source
analiza antes de llamar a la función y $database_username
es uno de los parámetros opcionales allí.
Ahora bien, esto obviamente no funciona. No puedo asignar $3
y 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?
- Obtenga el valor de la variable de cualquiera
config.cfg
o léalo de la entrada del usuario - 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 config
archivo 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 $dbUser
contendrá 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 -p
pude 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.