Intereting Posts
как приложения взаимодействуют через сокеты проблемы с загрузкой Ubuntu : метод ACPI _BQC, не может определить начальную яркость Использовать общие библиотеки в / usr / local / lib Очистить старые / dev / pts файлы? OpenVPN: Как изменить параметры server.conf и client.conf, чтобы указать на сгенерированные ключевые файлы? Мышь левой кнопкой мыши перестает работать Сравните различные IP-адреса в двух файлах? Как я могу перечислить доступные видеорежимы для моего экрана? mod_evasive: белый список, из-за отсутствия журналов доступа? GID, текущие, первичные, дополнительные, эффективные и реальные идентификаторы групп? Параметры команды с дефис или нет Почему этот фрагмент оболочки проверяет, были ли хосты запущены с отключением netcat преждевременно? Как я могу узнать, защищена ли защита паролем, прежде чем подключаться к нему? Может ли написать stdout место противодавления в процессе? Как я могу написать во вторую строку файла из командной строки?

Цикл, чтобы продолжать запрашивать значение, пока пользователь не введет уникальное значение

Я создаю сценарий для автоматизированных задач, касающихся 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}' } 

    В общем:

     # 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 .

    Вот два разных способа проверить наличие VG:

    1. попытка чтения VG напрямую vgs --readonly "$vgname" ; если эта команда выполнена успешно, VG уже существует.
    2. Если 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