
Eu tenho a seguinte situação:
Estou escrevendo um script que lerá seus parâmetros de um arquivo de configuração (se existir e o parâmetro estiver presente) ou solicitará ao usuário que insira esse parâmetro, se ele não estiver presente.
Como estou fazendo isso para alguns parâmetros, pensei que escrever uma função seria o caminho a percorrer.
No entanto, pelo que entendi, a função retorna o valor do resultado fazendo- echo
o ou atribuindo-o a uma variável global. Eu quero ecoar na tela da função, então terá que ser a opção dois. Então eu tentei isso:
# 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
}
Eu chamo assim:
getParameter "Database username" "Please enter database username" $database_username
O config.cfg
arquivo é source
d antes da função ser chamada e $database_username
é um dos parâmetros opcionais.
Agora, isso obviamente não funciona. Não posso atribuir $3
e como quero que o método seja genérico, também não posso MY_VARIABLE=$parameter
.
Alguém tem alguma sugestão de como posso conseguir todos os itens abaixo:
- Obtenha o valor da variável
config.cfg
ou leia-o na entrada do usuário - Faça isso de forma genérica, ou seja, não repita o código acima (sem função) para cada parâmetro
Responder1
Não tenho 100% de certeza se entendi, mas digamos que um config
arquivo se pareça com isto:
foo
database_user tom
bar
O valor óbvio que queremos é o de database_user
.
Em um script você poderia simplesmente colocar uma linha como esta:
dbUser=$(sed -nE 's/database_user (.*$)/\1/p' config)
Então a variável $dbUser
conterá esta informação:
echo $dbUser
tom
Responder2
Tudo bem, parece que resolvi meu próprio 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
}
Usando echo -p
consegui mostrar um prompt no console e ainda conseguir retornar uma string da função usando regular echo
. Dessa forma, chamando a função com database_username=$(getParameter ...)
posso atribuí-la a uma variável.