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

1

Eu tenho a seguinte situação:

Estou escrevendo um script que lerá seus parâmetros a partir de um arquivo de configuração (se existir e um parâmetro presente) ou solicitar que o usuário insira o parâmetro se não estiver presente.

Como estou fazendo isso por um punhado de parâmetros, achei que criar uma função seria o caminho a ser seguido.

No entanto, até onde eu entendi, a função retorna o valor do resultado por echo ing ou atribuindo-a a uma variável global. Eu quero fazer eco na tela na 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 arquivo config.cfg é source d antes de a função ser chamada e $database_username é um dos parâmetros opcionais existentes.

Agora isso obviamente não funciona. Não posso atribuir a $3 e, como quero que o método seja genérico, também não posso fazer MY_VARIABLE=$parameter .

Alguém tem alguma sugestão de como posso alcançar todos os itens abaixo:

  1. Obtenha o valor da variável em config.cfg ou leia-o na entrada do usuário
  2. Faça isso de maneira genérica, ou seja, não repita o código acima (sem uma função) para cada parâmetro
por Baz 02.11.2016 / 18:06

2 respostas

0

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 ser capaz de retornar uma string da função usando echo regular. Dessa forma, chamando a função com database_username=$(getParameter ...) eu posso atribuí-la a uma variável.

    
por 03.11.2016 / 10:00
0

Não tenho 100% de certeza de que sigo, mas digamos que um arquivo config tenha esta aparência:

foo
database_user tom
bar

O valor obvius que queremos é o de database_user .

Em um script, você pode simplesmente colocar uma linha como esta:

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

Em seguida, a variável $dbUser conterá essa informação:

echo $dbUser 
tom
    
por 02.11.2016 / 18:25