Quero colocar um rápido "tem a certeza?" pronto para confirmação no topo de um argumento potencialmente perigoso, qual'é a maneira mais fácil/mais fácil de o fazer?
leia -p "Tem a certeza? " -n 1 -r
echo # (opcional) passar para uma nova linha
se [[ $REPLY =~ ^[Yy]$ ]]
então
# fazer coisas perigosas
fi
Incorporei levislevis85's sugestão (obrigado!) e acrescentei a opção -n
para "ler" para aceitar um carácter sem necessidade de pressionar Enter. Pode utilizar um ou ambos.
Além disso, a forma negada pode parecer-se com esta:
leia -p "Tem a certeza? " -n 1 -r
echo # (opcional) passar para uma nova linha
se [[ ! $REPLY =~ ^[Yy]$ ]]
então
[[ "$0" = "$BASH_SOURCE" ]] && saída 1 ||| retorno 1 # manípulo sai da concha ou função mas don't saia da concha interactiva
fi
No entanto, tal como Erich salientou, em algumas circunstâncias, tais como um erro de sintaxe causado por o guião ser executado na casca errada, a forma negada poderia permitir que o guião continuasse para o "material perigoso". O modo de falha deve favorecer o resultado mais seguro, pelo que apenas deve ser utilizado o primeiro "se", não-negado.
Explicação:
O comando read' emite o prompt (
-p "prompt") depois aceita um carácter (
-n 1) e aceita contrabarras literalmente (
-r) (caso contrário
read' veria a contrabarra como uma fuga e esperaria por um segundo carácter). A variável padrão para "ler" para armazenar o resultado é $REPLY
se não'não forneça um nome como este: read -p "my prompt" -n 1 -r my_var
A declaração 'se' utiliza uma expressão regular para verificar se o carácter em $REPLY' corresponde (
=~) a um " maiúsculo ou minúsculo;Y". A expressão regular aqui utilizada diz "uma cadeia que começa (
^) e consiste unicamente numa lista de caracteres numa expressão entre parênteses (
[Yy]) e termina (
$)". As âncoras (
^e
$) impedem a correspondência de cordas mais longas. Neste caso, ajudam a reforçar o limite de um carácter definido no comando
read'.
A forma negada utiliza a lógica "not" operador (!
) para combinar (=~
) qualquer carácter que não seja "Y" ou "y" y". Uma forma alternativa de expressar isto é menos legível e não't tão claramente expressa a intenção na minha opinião neste caso. No entanto, isto é o que pareceria: se [[ $REPLY =~ ^[^Yy]$ ]]``Se [[ $REPLY =~ ^[^Yy]$ ]]