특정 요구 사항이 충족될 때까지 스크립트의 특정 부분을 반복합니다.

특정 요구 사항이 충족될 때까지 스크립트의 특정 부분을 반복합니다.

특정 변수가 설정될 때까지 스크립트의 특정 부분을 반복할 수 있는 방법이 있습니까?

내 말은, 나는 다음과 같은 것을 가지고 있습니다 :

#!/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

나는 그것을 다음과 같은 것으로 바꾸고 싶습니다 :

#!/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

이렇게 하면 사용자 입력에 따라 하나의 값만 반환될 때까지 이 부분(사용자 입력을 읽은 다음 작업 수행)을 반복할 수 있습니다.

나는 이것이 "for" 루프를 사용하여 달성될 수 있다고 생각하지만, 그러한 것이 존재한다면 더 쉬울 것이라고 생각합니다(이 시스템은 내가 사용했던 어떤 종류의 프로그램에서 구현된 것 같습니다).

내가 언급한 FLAG 및 GO TO FLAG 시스템을 선호하는 이유는 스크립트 전체에서 언제든지 플래그로 돌아갈 수 있고 스크립트 흐름을 더 잘 제어할 수 있기 때문입니다. 따라서 FLAG1을 어딘가에 배치하고 스크립트의 여러 부분(단지 하나가 아님)에서 FLAG1로 이동할 수 있습니다. 이는 for 루프로는 수행하기 어렵습니다.

답변1

질문에 있는 스크립트만 사용하여 비슷한 작업을 수행할 수 있을 것입니다(현재 다른 잠재적인 개선 사항은 무시).

 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

관련 정보