Função Bash atribui valor ao parâmetro passado

Função Bash atribui valor ao parâmetro passado

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- echoo 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.cfgarquivo é sourced antes da função ser chamada e $database_usernameé um dos parâmetros opcionais.

Agora, isso obviamente não funciona. Não posso atribuir $3e 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:

  1. Obtenha o valor da variável config.cfgou leia-o na entrada do usuário
  2. 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 configarquivo 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 $dbUserconterá 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 -pconsegui 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.

informação relacionada