Execute o comando anterior até que a resposta seja não [script condicional]

0

Eu tenho tentado escrever um script que perguntará ao usuário se ele deve executar o comando novamente.

Se a resposta for sim, então deve executar o último comando novamente. Mesmo após a segunda execução, deve perguntar ao usuário se deve executar o último comando ou não. Eu quero que isso aconteça até que a resposta se torne não, se a resposta for não, então deve sair.

i.e.

$ cat shellscript.sh
  echo foo
  printf 'Can I run the last command (y/n)?' 

Se minha resposta for sim, então deve executar o comando "echo foo"

  # after the 1st time execution
  printf 'Can I run the last command again (y/n)?'

Ele executará o comando novamente se a resposta for sim, fará o mesmo (pedindo y / n e a execução) até que a resposta seja sim. se não, então deve sair.

Acho que preciso implementar algum tipo de loop, mas fiquei confuso, pois isso é um script condicional.

    
por smc 12.04.2018 / 14:38

2 respostas

1

Usando o bash:

while [[ "$REPLY" != "no" ]]
do
  echo foo
  read -p "Can I run the last command (yes/no)?"
done

Isso requer uma resposta literal "não" para sair do loop e, como tal, soletrei o prompt "sim / não" um pouco mais.

O read do bash permite um prompt personalizado (o -p e sequência de caracteres) e armazena a resposta do usuário na variável $ REPLY, que suponho que não seja "não" antes de inserir o loop (está vazio se você ' read nada ainda'.

    
por 12.04.2018 / 14:53
0

Uma alternativa à resposta de Jeff :

while true; do
    somecommand

    while true; do
        read -p 'Can I run the last command again (yes/no)? '

        case "$REPLY" in
            [Yy]*) break   ;;
            [Nn]*) break 2 ;;
            *) echo 'Sorry, what?' >&2
        esac
    done
done

A principal diferença aqui é que estamos insistindo em obter uma resposta válida do usuário. Uma resposta válida é qualquer string que comece com y ou n (maiúsculas e minúsculas ignoradas).

O break sairá do loop de leitura de resposta, enquanto break 2 adicionalmente sairá do loop de comando.

    
por 12.04.2018 / 18:13