Eu quero escrever um script no bash que verifique a entrada do usuário se for igual a "stringA" ou "stringB" e, caso seja igual a uma dessas strings, deve imprimir a entrada do usuário. Meu código é:
#!/bin/bash
echo "Please enter your choice (stringA or stringB): "
read result
while [[ (${result,,} != 'stringa') || (${result,,} != 'stringb') ]]; do
echo Please enter only stringA or stringB:
read result
done
echo "You have selected $result!"
exit
Infelizmente, este código não funciona e faz um loop infinito. Só posso comparar se o $result
é igual a uma das strings removendo o ||
e a segunda parte do loop while. Eu tentei substituir o ||
com -o
, mas recebi o seguinte erro:
./chk.sh: line 12: syntax error in conditional expression
./chk.sh: line 12: syntax error near `-o'
./chk.sh: line 12: `while [[ (${result,,} != 'stringa') -o (${result,,} != 'stringb') ]]; do'
Isso é porque você quer usar
&&
, não||
.Você deseja repetir o loop se o resultado não for stringA E não for stringB. Nenhuma string pode ser igual a ambas, o que encerraria seu loop.
Você também pode usar um padrão em
[[ ... ]]
:No textspeech, enquanto o resultado não é stringa ou o resultado é stringb, faça ...
esteja ciente de
"
suas variáveis, caso contrário, você receberá um erro se a var$result
estiver vazia.O problema em seu código é que seu loop loop while
$result
não é o mesmo que ambosstringA
estringB
(ao mesmo tempo). Você pode querer usarou
Para fazer com que um usuário escolha uma das poucas opções, não o faça digitar strings longas. Em vez disso, forneça a eles um menu simples para escolher.
Sugestão:
Executando isso:
Uma
sh
variante e removeria os problemas associados ao${var,,}
qual usa a localidade para converter strings (minúsculasI
não sãoi
para todos, por exemplo):