쉘 스크립트에서 사용자에게 반복적으로 메시지를 표시하는 방법은 무엇입니까?

쉘 스크립트에서 사용자에게 반복적으로 메시지를 표시하는 방법은 무엇입니까?

if/elif/else/fi 문 집합에서 "else"가 사용자에게 오류 메시지를 표시하도록 했지만, 사용자가 if/else 문 이전에 묻는 질문으로 돌아가서 사용자가 시도할 수 있도록 하고 싶습니다. 그 질문에 다시 대답하기 위해.

사용자를 이전 코드 줄로 되돌리려면 어떻게 해야 합니까? 아니면 이것이 가능하지 않은 경우 다른 방법이 있습니까?

답변1

가장 쉬운 방법은 프롬프트 코드를 함수로 감싸서 until루프에 넣는 것입니다.

실제로 필요한 것은 성공할 때까지 함수를 호출하는 것이므로, :Until 루프에 noop 명령 " "을 넣을 수 있습니다.

이 같은:

#!/bin/bash

getgender() {
  read -p "What is the gender of the user? (male/female): " gender
  case "$gender" in
    m|M)
      grouptoaddto="boys"
      return 0
      ;;
    f|F)
      grouptoaddto="girls"
      return 0
      ;;
    *)
      printf %s\\n "Please enter 'M' or 'F'"
      return 1
      ;;
  esac
}

until getgender; do : ; done
sudo usermod -a -G "$grouptoaddto" "$username"

여기서 핵심은 호출된 함수를 사용하는 것이므로 until성공할 때까지 반복적으로 호출됩니다. 함수 내의 대소문자 전환은 단지 예일 뿐입니다.


함수를 사용하지 않는 더 간단한 예:

while [ -z "$groupname" ]; do
  read -p "What gender is the user?" answer
  case "$answer" in
    [MmBb]|[Mm]ale|[Bb]oy) groupname="boys" ;;
    [FfGg]|[Ff]emale|[Gg]irl) groupname="girls" ;;
    *) echo "Please choose male/female (or boy/girl)" ;;
  esac
done
sudo usermod -a -G "$groupname" "$username"

마지막 예에서는 "groupname" 변수의 길이가 0인 동안 -z스위치 to (테스트) 명령을 사용하여 루프를 계속합니다.[

핵심은 while또는 을 사용하는 것입니다 until.

마지막 예를 사람이 읽을 수 있는 의사 코드로 변환합니다.

While groupname is empty,

  ask user for gender.

  If he answers with one letter "m" or "B",
    or the word "Male" or "boy",
    set the groupname as "boys".

  If she answers with one letter "F" or "g",
    or the word "female" or "Girl",
    set the groupname as "girls".

  If he/she answers anything else, complain.

(And then repeat, since groupname is still empty.)

Once you have groupname populated,
  add the user to that group.

변수가 없는 또 다른 groupname예:

while true; do
  read -p "What gender is the user?" answer
  case "$answer" in
    [MmBb]|[Mm]ale|[Bb]oy)
      sudo usermod -a -G boys "$username"
      break
      ;;
    [FfGg]|[Ff]emale|[Gg]irl)
      sudo usermod -a -G girls "$username"
      break
      ;;
    *) echo "Please choose male/female (or boy/girl)" ;;
  esac
done

답변2

flag=1
while [ ${flag} -eq 1 ]
do
  read -p "Please answer B or G " bg
  if [ "${bg}" = B ] || [ "${bg}" = b ] 
  then
    flag=0
    groupname=boys
  else 
    if [ "${bg}" = G ] || [ "${bg}" = g ]
    then
      flag=0
      groupname=girls
    fi
  fi
done
sudo usermod -a -G ${groupname} $username

이것이 무슨 일이 일어나고 있는지 명확하게 보여주면서 제가 생각할 수 있는 가장 간단한 방법입니다.

관련 정보