Repetir uma parte específica de um script até que um requisito específico seja cumprido

0

Existe alguma maneira de eu passar por uma parte específica de um script até que uma variável específica seja definida?

O que quero dizer com isto é que tenho algo assim:

#!/bin/bash

# Check if sudo
if [ $UID -ne 0 ]; then
        echo "You have to run this as sudo" 1>&2
        exit 1
fi

# Get the date for the check
read -p "Please input a date, format 'Jan 12': " chosendate

# Get the time for the check
read -p "Please input the time, format '13:55', leave blank for no time: " chosentime

# Get last results based on input
gotresults=$(last |grep "$chosendate $chosentime" |awk '{print $1" " $5" " $6" " $7" " $9}')

if [[ $(echo "$gotresults"|wc -l) -ne 1 ]]; then
        echo "There are multiple entries corresponding to your input"
        echo
        echo "$gotresults"
        echo
read -p "Please select which entry you desire by typing in the time: " chosentime
        echo "$gotresults" |grep $chosentime
else
        echo "$gotresults"
fi

Eu quero substituir isso com algo assim:

#!/bin/bash

# Check if sudo
if [ $UID -ne 0 ]; then
        echo "You have to run this as sudo" 1>&2
        exit 1
fi

**FLAG1**
# Get the date for the check
read -p "Please input a date, format 'Jan 12': " chosendate

# Get the time for the check
read -p "Please input the time, format '13:55', leave blank for no time: " chosentime

# Get last results based on input
gotresults=$(last |grep "$chosendate $chosentime" |awk '{print $1" " $5" " $6" " $7" " $9}')

if [[ $(echo "$gotresults"|wc -l) -ne 1 ]]; then
        echo "There are multiple entries corresponding to your input"
        echo
        echo "$gotresults"
        echo
        echo "Please select a date/time that only returns one value"
        **GO TO FLAG1**

else
        echo "$gotresults"
fi

Dessa forma, eu poderia percorrer essa parte (ler a entrada do usuário e depois fazer a operação) até que, com base na entrada do usuário, haja apenas um valor retornado.

Acho que isso é possível com um loop "for", mas eu acharia mais fácil se isso existisse (acho que esse sistema foi implementado em algum tipo de programa que eu usei).

A razão pela qual eu preferiria o sistema FLAG e GO TO FLAG que eu mencionei, é porque eu poderia voltar a uma flag sempre que eu quisesse através do script, e eu teria maior controle sobre o fluxo do script. Então, eu poderia ter FLAG1 em algum lugar e, em seguida, ir para FLAG1 em várias partes do meu script, não apenas um, o que seria difícil de fazer com loops for.

    
por user317076 22.10.2018 / 15:04

1 resposta

1

Com apenas o script da pergunta, eu provavelmente faria algo como (ignorando outras possíveis melhorias por enquanto)

 have_results=0
 while [[ $have_results -eq 0 ]]; do
     read -p "Please input a date, format 'Jan 12': " chosendate
     read -p "Please input the time, format '13:55', leave blank for no time: " chosentime

     gotresults=$(last |grep "$chosendate $chosentime" |awk '{print $1" " $5" " $6" " $7" " $9}')

    if [[ $(echo "$gotresults"|wc -l) -ne 1 ]]; then
        echo "Please select a date/time that only returns one value"
    else
        have_results=1
    fi
done
    
por 22.10.2018 / 15:23