대답이 "no"가 될 때까지 이전 명령을 실행합니다. [조건부 스크립트]

대답이 "no"가 될 때까지 이전 명령을 실행합니다. [조건부 스크립트]

나는 명령을 다시 실행해야 하는지 사용자에게 묻는 스크립트를 작성하려고 했습니다.

대답이 '예'이면 마지막 명령을 다시 실행해야 합니다. 두 번째 실행 후에도 마지막 명령을 실행해야 하는지 사용자에게 물어봐야 합니다. 나는 대답이 "아니요"가 될 때까지 이 일이 일어나기를 원하며, 대답이 "아니오"라면 종료되어야 합니다.

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

내 대답이 '예'라면 "echo foo" 명령을 실행해야 합니다.

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

대답이 '예'이면 명령을 다시 실행하고 대답이 '예'가 될 때까지 동일한 작업(y/n을 묻고 수행)을 수행합니다. 그렇지 않은 경우 종료되어야 합니다.

일종의 루프를 구현해야 할 것 같은데 이것이 조건부 스크립트이기 때문에 혼란스럽습니다.

답변1

배시 사용:

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

루프를 종료하려면 문자 그대로 "아니요"라고 대답해야 하므로 "예/아니요" 프롬프트를 더 자세히 설명했습니다.

bash는 read사용자 정의 프롬프트( -p이후 및 문자열)를 허용하고 사용자의 응답을 $REPLY 변수에 저장합니다. 루프에 들어가기 전에는 "아니오"라고 생각하지 않습니다(아직 아무 것도 없으면 read비어 있습니다).

답변2

대안제프의 ​​대답:

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

여기서 가장 큰 차이점은 사용자로부터 유효한 응답을 받아야 한다는 것입니다. 유효한 응답은 또는로 시작하는 문자열입니다 y( n대소문자 무시).

break답변 읽기 루프 가 중단 되고 break 2명령 루프도 중단됩니다.

관련 정보