alternativa de verificação de leitura (dois prompts e alternativa de comparação if-then)

1

Estou tentando criar um script pequeno para a criação de arquivos host simples e padrão do Apache (ele deve ser usado sempre que eu estabelecer um novo aplicativo da Web).

Esse script solicita o domain.tld do aplicativo da Web e também as credenciais do banco de dados, em read operations verificadas:

read -p "Have you created db credentials already?" yn
case $yn in
    [Yy]* ) break;;
    [Nn]* ) exit;;
    * ) echo "Please create db credentials and then comeback;";;
esac

read -p "Please enter the domain of your web application:" domain_1 && echo
read -p "Please enter the domain of your web application again:" domain_2 && echo
if [ "$domain_1" != "$domain_2" ]; then echo "Values unmatched. Please try again." && exit 2; fi

read -sp "Please enter the app DB root password:" dbrootp_1 && echo
read -sp "Please enter the app DB root password again:" dbrootp_2 && echo
if [ "$dbrootp_1" != "$dbrootp_2" ]; then echo "Values unmatched. Please try again." && exit 2; fi

read -sp "Please enter the app DB user password:" dbuserp_1 && echo
read -sp "Please enter the app DB user password again:" dbuserp_2 && echo
if [ "$dbuserp_1" != "$dbuserp_2" ]; then echo "Values unmatched. Please try again." && exit 2; fi

Por que eu faço isso com o Bash

Por enquanto, eu preferiria a automação Bash sobre a automação Ansible porque a Ansible tem uma curva de aprendizado íngreme e seus documentos (bem como alguns livros impressos que comprei sobre ela), onde não são claros ou úteis para aprender a usá-los) . Eu também prefiro não usar imagens do Docker e depois alterá-las após a compilação.

Meu problema

O script Bash inteiro (que eu não trouxe aqui em sua plenitude) é um pouco mais longo e o chuck de texto "pesado" acima o torna significativamente mais longo - ainda que seja principalmente uma questão estética.

Minha pergunta

Existe uma alternativa para as operações de leitura verificadas? Um utilitário que solicita duas vezes e compara de uma só vez?

    
por JohnDoea 23.11.2018 / 05:30

2 respostas

3

Que tal uma função de shell? Como

function read_n_verify  {
    read -p "$2: " TMP1
    read -p "$2 again: " TMP2
    [ "$TMP1" != "$TMP2" ] &&
    { echo "Values unmatched. Please try again."; return 2; }
    read "$1" <<< "$TMP1"
}
read_n_verify domain "Please enter the domain of your web application" 
read_n_verify dbrootp "Please enter the app DB root password" 
read_n_verify dbuserp "Please enter the app DB user password"

Em seguida, faça as ações desejadas com $domain , $dbrootp , $dbuserp .

$1 é usado para transportar o nome da variável para o próximo read do "aqui string", que por sua vez é usado como é mais fácil aqui do que um (também pode ser usado) "here document". / p>

$2 contém o texto de prompt (livre), usado por último para permitir (uma espécie de) tamanho de texto "ilimitado".

TMP em letras maiúsculas e [ ... ] && "sintaxe do açúcar" (o que quer que isso possa ser) são usados por preferência pessoal.

if - then - fi também poderia ser usado e eliminaria a necessidade de que as chaves que coletam vários comandos em um único comando sejam executadas como a ramificação && .

    
por 23.11.2018 / 18:27
1

Eu faria assim:

#!/bin/bash
while [[ $string != 'string' ]] || [[ $string == '' ]] 
do
    read -p "Please enter the domain of your web application: " string
    echo "Please enter the domain of your web application: "
done 
Command 1
Command 2

Less typing.

É claro que você precisaria de uma seção como essa para todas as suas perguntas.

Além do jeito que você tem e do jeito que eu tenho, não há mais opções.

    
por 24.11.2018 / 16:14