루프는 사용자가 고유한 값을 입력할 때까지 계속해서 값을 묻습니다.

루프는 사용자가 고유한 값을 입력할 때까지 계속해서 값을 묻습니다.

LVM 관련 작업을 자동화하기 위한 스크립트를 만들고 있습니다. 스크립트에서 사용자가 VG 이름을 입력하기를 원하며 이름은 고유해야 합니다. 사용자가 시스템에 이미 존재하는 VG 이름을 입력할 때 앞으로 이동하지 않고 고유할 때까지 VG 이름을 계속 묻도록 루프를 만들려면 어떻게 해야 합니까?

VG를 만드는 데 사용하는 기능은 다음과 같습니다.

vg_create(){
        printf "\n"
        printf "The list of volume groups in the system are: \n"
        vgs | tail -n+2 | awk '{print $1}'

        printf "\nThe list of Physical Volumes available in the OS are as follows: \n"
        view_pvs  ## Calling another function
        printf "\n"
        printf "[USAGE]: vgcreate vgname pvname\n"
        read -p "Enter the name of the volume group to be created: " vgname
        printf "\n"

        vg_match=`pvs | tail -n+2 | awk '{print $2}' | grep -cw $vgname`

                if [ $vg_match -eq 1 ]; then
                   echo -e "${vgname} already exists. Kindly enter new name.\n"
                else
                   echo -e "${vgname} doesn't exist in system and will be created.\n"
                fi
        read -p "Enter the name of the physical volume on which volume group to be created: " pv2_name
        printf "\n"
        vgcreate ${vgname} ${pv2_name}

        printf "\n"
        printf "The new list of volume groups in the system are: \n"
        vgs | tail -n+2 | awk '{print $1}'
}

답변1

일반적으로 말하면:

# loop until we get correct input from user
while true; do
    # get input from user

    # check input

    # break if ok
done

또는 더 구체적으로 말하면 다음과 같습니다.

# loop until we get correct input from user
while true; do
    read -r -p "Give your input: " answer

    # check $answer, break out of loop if ok, otherwise try again

    if pvs | awk 'NR > 2 {print $2}' | grep -qw -e "$answer"; then
        printf '%s already exists\n' "$answer" >&2
    else
        break
    fi
done

pvs참고: 무슨 뜻인지 모르겠습니다 .

답변2

VG가 존재하는지 확인하는 두 가지 방법은 다음과 같습니다.

  1. VG를 직접 읽어 보십시오 vgs --readonly "$vgname". 명령이 성공하면 VG가 이미 존재하는 것입니다.
  2. vgname이 출력에 나열되어 있으면 vgsVG가 이미 존재하는 것입니다.

두 번째 방법에는 특별히 vgs요구되는 사항이 있습니다.아니요제목과 VG 이름 필드만 인쇄합니다. 내 시스템의 이름은 일반적으로 앞뒤에 공백이 포함되어 인쇄되므로 grep표현식이 이렇게 보입니다.

read -p "Enter the name of the volume group to be created: " vgname
while vgs --readonly "$vgname" > /dev/null 2>&1
do
  read -p "Enter the name of the volume group to be created: " vgname
  if vgs --noheadings -o vg_name | grep -q "^ *${vgname} *\$"
  then
    printf "That VG name is already taken; try something else\n" >&2
  fi
done

관련 정보