Avisar o usuário para sentença e armazená-lo sem ser perturbado por espaços

2

Eu tenho uma função bash que solicita ao usuário para inserir certos dados. Eu tentei com o primeiro nome, sobrenome, aniversário etc.

Dados mais representados em uma frase.

Quando peço rua + não. a função quebra, porque não consegue lidar com espaços.

askForData 'Please enter your street and number' STREET

Recebo o seguinte erro.

Please enter your street and number: ExampleStreet 123
func_askForData: line 21: 123: command not found

Como posso estender minha função para aceitar sentenças?

arquivo: func_askForData

#!/bin/bash

# Usage askForData "Prompt for value" VARIABLE
# Prints out prompt and stores input in VARIABLE
# 
# Prompt is printed till non-empty input is made.

function askForData()
{
local PROMPT=${1}
eval local VAR_NAME=${2}

local CONTINUE=true
while ${CONTINUE}
    do
        read -p "${PROMPT}: " VAR_VALUE
        if [ -z "$VAR_VALUE" ]; then
            CONTINUE=true
        else
            CONTINUE=false
            eval ${VAR_NAME}="${VAR_VALUE}"
        fi
    done
}

Informações adicionais

bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.
    
por mike 09.06.2013 / 22:18

1 resposta

3

Use

eval ${VAR_NAME}='"${VAR_VALUE}"'

Com eval , você obtém, em geral, uma expansão dupla. Se houver alguma coisa em uma instrução eval que deve ser expandida apenas uma vez, geralmente é melhor citá-las de forma que a primeira expansão não faça nada (exceto a remoção de cotações) e a segunda expansão faça o trabalho principal. Neste caso concreto, a primeira expansão produz

STREET="${VAR_VALUE}"

que é então executado corretamente durante a segunda expansão. Se você tentar fazer o contrário, é difícil garantir que o resultado da primeira expansão permaneça inalterado durante a segunda expansão.

Eu também tenho a impressão de que o primeiro eval (antes local VAR_NAME=${2} é supérfluo.

    
por 09.06.2013 / 22:39