bash definiu a matriz e compara a entrada com o valor da matriz armazenada

0
#!/bin/bash

declare -a all=("a" "b" "c")

echo -n  "Please enter one value ${all[@]} [ENTER]: "
read site
echo "You entered $site as site"
read -p "Continue? (Y/N): " confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1


for item in "${all[@]}"; do
echo $item
 if [[ "${site}" == "${all[@]}" ]]; then
  echo "Site Name validated"
 else
  echo "No Match For Site Name" && exit 1
 fi
done

Na entrada, mesmo se digitar a, b ou c. Eu não sou capaz de validar a entrada contra o array definido, não atendendo se a instrução Obrigado antecipadamente ..

    
por harman 27.09.2018 / 05:03

2 respostas

0

Um teste simples de regex como

[[ " ${all[@]} " =~ " $site " ]] && echo in || echo out

pode ser suficiente. Você pode querer proteger contra falsos positivos, no entanto.

E, da maneira como avalia a confirmação, o script será encerrado com um código de saída de erro se você inserir y , Y ou yes em qualquer combinação de maiúsculas e minúsculas.

    
por 27.09.2018 / 11:18
2

(suponho que você tenha alterado if [[ "${site}" == "${all[@]}" ]] para if [[ "$site" == "$item" ]] .)

Imagine como o seu loop é executado. Suponha que você digite b . A primeira iteração do loop define item igual a a . Você compara b a a . Se eles fossem iguais, você reportaria a validação. Mas eles não são iguais, então você relata falhas e sai.

Não é melhor digitar a . Na primeira iteração do loop, item é a e você reporta sucesso e continua em loop . Então item se torna b , e você entra na cláusula else , onde você reporta falha e sai.

O problema é que você reporta falha se a entrada é diferente de qualquer um dos valores válidos. Mas a entrada any será diferente de pelo menos dois dos valores válidos (entradas inválidas serão diferentes das três). Você precisa reportar sucesso se a entrada for igual a qualquer um dos valores válidos, e falha de outra forma.

Exatamente como você faz isso depende do quadro geral. Se ler a entrada e validar é tudo que você quer fazer, você precisa apenas de um pequeno rearranjo do seu código atual:

for item in "${all[@]}"; do
    echo "$item"
    if [[ "$site" == "$item" ]]; then
        echo "Site Name validated" && exit 0
    fi
done
echo "No Match For Site Name" && exit 1

Mas se (como é provável) você quer que o script continue e faça algo com uma entrada válida, uma boa maneira é usar um sinalizador:

valid=
for item in "${all[@]}"; do
    echo "$item"
    if [[ "$site" == "$item" ]]; then
        echo "Site Name validated" && valid=1
    fi
done
if ! [ "$valid" ]
then
    echo "No Match For Site Name" && exit 1
fi
# (script continues with valid input)
               ︙

P.S. Você não precisa dizer "${site}" neste contexto; "$site" está bem.

    
por 27.09.2018 / 06:42