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가 존재하는지 확인하는 두 가지 방법은 다음과 같습니다.
- VG를 직접 읽어 보십시오
vgs --readonly "$vgname"
. 명령이 성공하면 VG가 이미 존재하는 것입니다. - vgname이 출력에 나열되어 있으면
vgs
VG가 이미 존재하는 것입니다.
두 번째 방법에는 특별히 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