1

Я хочу создать новый пользовательский сценарий, который я могу использовать для создания второго или третьего.

Пока что у меня есть что-то подобное, но я застрял на отдыхе.

#!/bin/bash
echo "Do you want to create a new user (y/n): "
read createNewUser

while [[ createNewUser ]]; do
   echo "Enter username: "
   read username
   echo "Enter first name: "
   read firstname
   echo "Enter last name: "
   read lastname

   useradd -g staff -c "${firstname} ${lastname}" -s /bin/bash $username

   mkhomedir_helper $username

 done 

Должен ли я снова задать вопрос перед оператором done или можно вместо этого включить его в начало цикла?

2 ответа2

2

Похоже , что вы просите за «Вы хотите , чтобы создать новый пользователь (г / п):» быстрые и вход будет в то время условного.

Пытаться:

#!/bin/bash

while [[ "$(read -p "Do you want to create a new user (y/n): " x; echo $x)" == "y" ]] ; do
   echo "Enter username: "
   read username
   echo "Enter first name: "
   read firstname
   echo "Enter last name: "
   read lastname

   useradd -g staff -c "${firstname} ${lastname}" -s /bin/bash $username

   mkhomedir_helper $username
done

Это должно запросить у вас подтверждение перед началом итерации.

2
  1. Прежде всего, когда ваш текущий сценарий говорит while [[ createNewUser ]] , он, по сути, говорит: «пока константа string createNewUser не является пустой строкой».  Таким образом, ваш текущий сценарий работает вечно, даже если вы ответите на вопрос « no.  Поскольку createNewUser является переменной, вам нужно ссылаться на нее как на $createNewUser .
  2. Как вы предположили, и джедай подтвердил , что если вы хотите, чтобы ваш скрипт создавал пользователя, а затем спрашивал, хотите ли вы сделать другого, он нужен вам как часть цикла.  Вот еще один способ сделать это; Я считаю (ИМХО), что это немного проще, чем ответ джедая:

    #!/bin/bash при чтении -p "Хотите создать нового пользователя (y/n):" createNewUser && [["$ createNewUser" == y *]] do echo "Введите имя пользователя:" прочитайте имя пользователя echo "Enter имя: "read firstname echo" Введите фамилию: "read фамилия useradd -g staff -c" $ firstname $ фамилия "-s /bin/bash" $ username "mkhomedir_helper" $ username "сделано

    Из спецификации POSIX Shell Command Language , формат while цикла выглядит следующим образом :

    в то время как составной список-1 делает составной список-2 готовым

    то есть, вы можете иметь несколько операторов между while и do .  (Думаю, джедай наклоняется назад, чтобы сделать это с помощью одной команды.)  Мой подход разделяет запрос и тест на два отдельных простых утверждения.  Цикл будет продолжать выполняться до тех пор, пока read завершится успешно, а пользовательский ответ (т. Е. Ваш ответ) начнется с y (поскольку два оператора разделены &&).

  3. Пока вы используете bash, используете [[]] (вместо []) и используете == (вместо =), правая сторона теста может быть шаблоном как и те, которые вы используете для расширения пути (например, globs /wildcards).  Протестировав [[ "$createNewUser" == y* ]] , ваш скрипт примет любой ввод, начинающийся с y , например, yes , yeah , yup и you bet!

    Обратите внимание, что y* не должен заключаться в кавычки, иначе скрипт будет принимать только буквальную строку y* .

  4. Вы должны всегда заключать в кавычки переменные вашей оболочки (например, "$username"), если у вас нет веских причин не делать этого, и вы уверены, что знаете, что делаете.  Строго говоря, вам может не потребоваться тест [[ "$createNewUser" == y* ]] (первая позиция в [[ test in bash обрабатывается специально), но обычно рекомендуется привыкнуть к привычке всегда делаю это, если у вас нет реальной причины не делать этого.
  5. Мы заключаем в кавычки переменные для обработки значений, которые содержат пробелы и другие специальные символы.  Ваш сценарий был бы лучше, если бы вы убедились, что $username содержит только символы, допустимые в именах пользователей; в противном случае useradd может потерпеть неудачу.  (Вы также можете проверить, не работает ли useradd , выполнив

        useradd -g staff -c "$ firstname $ lastname" -s /bin/bash "$ username" && mkhomedir_helper "$ username"

    или же

        если useradd -g staff -c "$ firstname $ lastname" -s /bin/bash "$ username", то mkhomedir_helper "$ username" else echo "useradd fail" fi

    Кроме того, вы также можете проверить, успешно ли работает mkhomedir_helper .)

  6. Вам не нужно { и } в "${firstname} ${lastname}" .  См. Использование одинарной или двойной скобки в bash для обсуждения [[]] против [] И когда вам нужно использовать ${variable_name} .
  7. Вы можете проверить , является ли firstname или lastname является недействительным.  Например, если вы создавали учетную запись для музыканта Sting, и вы ввели Sting как его имя, а не его фамилию, его имя будет сохранено как Sting   (с пробелом в конце).  Рассмотреть что-то вроде

        if ["$ firstname" = ""] затем fullname = "$ lastname" elif ["$ lastname" = ""] затем fullname = "$ firstname" иначе полное имя = "$ firstname $ lastname" fi useradd -g staff -c "$ fullname" -s /bin/bash "$ username"

    Или вы можете просто задать один вопрос для полного имени пользователя.

  8. Вы можете рассмотреть вопрос о переходе всех операторов read для read -p сорта.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .