Usando 'read' para mais de uma variável

1

Então, estou escrevendo um script para executar basicamente meus aplicativos do docker rapidamente, eu tenho tudo funcionando bem, ele faz tudo que eu codifiquei para fazer.

Eu só tenho uma pergunta sobre uma das minhas funções:

function prompt_user() {
    echo "Enter details for docker build! If it's a new build, you can leave Host Directory and Remote Directory blank."
    echo "If you've already assigned variables and are running the host you can leave the already filled vars blank if you entered them before"
    echo " "
    echo "Enter details:"
    read -p "Image Name: " IMAGE_NAME
    read -p "IP Address: " IP_ADDRESS
    read -p "Port 1: " PORT_ONE
    read -p "Port 2: " PORT_TWO
    read -p "Container Name: " CONTAINER_NAME
    read -p "Node Name: " NODE_NAME
    read -p "Host Directory (Can leave this blank if you're building a new image): " HOST_DIRECTORY
    read -p "Remote Directory (Can leave this blank if you're building a new image): " REMOTE_DIRECTORY
}

Haveria uma maneira mais fácil de usar a leitura de forma menos repetitiva e atribuir todas as entradas às vars?

Aqui é o roteiro completo se você quiser dar uma olhada.

    
por iZodiac 05.07.2018 / 13:29

2 respostas

3

Não sei ao certo quanto é mais limpo do que a sua função existente, mas usando um array associativo (requer o bash v4.0 ou posterior) combinado com um loop for que você pode usar uma vez.

function prompt_user() {
    declare -A prompt_questions
    vars=(IMAGE_NAME IP_ADDRESS PORT_ONE PORT_TWO CONTAINER_NAME NODE_NAME HOST_DIRECTORY REMOTE_DIRECTORY)
    prompt_questions=(
        [IMAGE_NAME]='Image Name'
        [IP_ADDRESS]='IP Address'
        [PORT_ONE]='Port 1'
        [PORT_TWO]='Port 2'
        [CONTAINER_NAME]='Container Name'
        [NODE_NAME]='Node Name'
        [HOST_DIRECTORY]="Host Directory (Can leave this blank if you're building a new image)"
        [REMOTE_DIRECTORY]="Remote Directory (Can leave this blank if you're building a new image)"
    )
    cat <<EOF
Enter details for docker build! If it's a new build, you can leave Host Directory and Remote Directory blank.
If you've already assigned variables and are running the host you can leave the already filled vars blank if you entered them before

Enter details:
EOF
    for var in "${vars[@]}"; do
        read -rp "${prompt_questions[$var]}: " "$var"
    done
}
    
por 05.07.2018 / 15:22
1

Eu não acho que seu código atual seja tão ruim assim. A única parte repetida é read -p , que é apenas um par de caracteres. Você não pode se livrar dos nomes das variáveis ou dos prompts, de qualquer forma.

(No entanto, há algo em que alguém pode preferir argumentos de linha de comando em vez de scripts que perguntam coisas interativamente, mas essa é uma questão de preferência.)

De qualquer forma, como eu disse que não gostei particularmente da listagem dupla de nomes de variáveis que o array associativo de Jesse_b requer, aqui está outra alternativa:

prompt_user() {
    queries=(
        IMAGE_NAME='Image Name'
        IP_ADDRESS='IP Address'
        PORT_ONE='Port 1'
        PORT_TWO='Port 2'
        CONTAINER_NAME='Container Name'
        NODE_NAME='Node Name'
        HOST_DIRECTORY="Host Directory (Can leave this blank if you're building a new image)"
        REMOTE_DIRECTORY="Remote Directory (Can leave this blank if you're building a new image)"
    )
    echo "Enter details for docker build! If it's a new build, you can leave Host Directory and Remote Directory blank."
    echo "If you've already assigned variables and are running the host you can leave the already filled vars blank if you entered them before"
    echo " "
    echo "Enter details:"
    for query in "${queries[@]}"; do
        read -rp "${query#*=}: " "${query%%=*}"
    done
}

"${query#*=}" e "${query%%=*}" dividem efetivamente a string em query no primeiro sinal de igual.

    
por 05.07.2018 / 19:55