创建新的用户循环

创建新的用户循环

我想创建一个新的用户脚本,可以循环创建第二个或第三个。

到目前为止,我已经有了类似的东西,但我对其余的部分却束手无策。

#!/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 

我是否应该在完成语句之前再次询问该问题,或者是否可以将其包含在循环顶部?

答案1

听起来你问的是“您是否要创建新用户(y/n):”提示和输入必须在尽管有条件的。

尝试:

#!/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 ]],它本质上是在说“当常量字符串createNewUser不是空字符串时”。因此,即使你用以下方式回答问题,你当前的脚本也会一直运行no。由于createNewUser是一个变量,因此您需要将其引用为$createNewUser
  2. 正如你所猜测的绝地确认,如果您希望脚本创建一个用户,然后询问您是否要创建另一个用户,则需要它在循环中询问您。这是另一种方法;我相信(恕我直言)这比绝地武士的回答

    /bin/bash #!/bin/bash
    
    while read -p "您是否要创建新用户(y/n):" createNewUser &&
          [[ "$createNewUser" == y* ]]
        echo "输入用户名:"
        读取用户名
        echo "输入名字:"
        读名字
        echo "输入姓氏:"
        读姓氏
    
        useradd -g 员工 -c"$firstname $lastname" -s /bin/bash"$username"
    
        mkhomedir_helper“$用户名”
    完毕

    来自POSIX Shell 命令语言规范,循环的格式while如下:

    尽管化合物列表-1
        化合物列表-2
    完毕

    while即,您可以在和之间有多个语句do。(我猜 Jedi 正在竭尽全力用一个命令来做到这一点。)我的方法将查询和测试拆分为两个单独的简单语句。只要 成功,循环就会继续read运行 用户响应(即你的响应)以 开头y (因为两个语句之间用 分隔&&)。

  3. 只要您使用 bash,并且使用[[... ]](而不是[... ]),并且使用==(而不是=),测试的右侧就可以是一个模式,就像您用于路径名扩展的模式一样(即通配符/通配符)。通过测试,[[ "$createNewUser" == y* ]]您的脚本将接受以 开头的任何输入y,例如yesyeahyupyou bet!

    请注意y* 必须不是被引用,否则脚本将只接受文字字符串y*

  4. 你应该总是引用你的 shell 变量引用(例如,"$username"),除非你有充分的理由不这样做,并且你确定你知道自己在做什么。严格来说,你可能不需要[[ "$createNewUser" == y* ]]测试中(bash 中测试中的第一个位置[[被特殊处理),但是一般建议您养成总是这样做的习惯,除非您有真正的理由不这样做。
  5. $username我们引用变量来处理包含空格和其他特殊字符的值。如果您验证了仅包含用户名中有效的字符,您的脚本会更好;否则,useradd可能会失败。(您可能还想useradd通过执行以下操作来检查是否失败

        useradd -g staff -c "$firstname $lastname" -s /bin/bash "$username" &&
        mkhomedir_helper“$用户名”

    或者

        如果 useradd -g staff -c "$firstname $lastname" -s /bin/bash "$username"
        然后
            mkhomedir_helper“$用户名”
        别的
            echo“用户添加失败”

    进一步来说,您可能还想测试是否mkhomedir_helper成功或失败。)

  6. 您不需要{}"${firstname} ${lastname}"。请参阅在 Bash 中使用单括号或双括号 讨论[[...]]与 [...] 以及何时需要使用。${variable_name}
  7. 您可能想要测试firstnamelastname是否为空。例如,如果您正在为音乐家 Sting 创建帐户,并且您输入了Sting他的名字而没有输入他的姓氏,那么他的名字将被保存为Sting  (末尾有一个空格)。考虑类似

        如果 [ “$firstname” = “” ]
        然后
            全名=“$姓氏”
        elif [ “$姓氏” = “”]
        然后
            全名=“$firstname”
        别的
            全名=“$firstname $lastname”
        useradd -g 员工 -c "$全名" -s /bin/bash "$用户名"

    或者您可以只问一个问题,询问用户的全名。

  8. 您可能需要考虑将所有read语句切换为read -p多种形式。

相关内容