我想创建一个新的用户脚本,可以循环创建第二个或第三个。
到目前为止,我已经有了类似的东西,但我对其余的部分却束手无策。
#!/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
- 首先,当你当前的脚本说 时
while [[ createNewUser ]]
,它本质上是在说“当常量字符串createNewUser
不是空字符串时”。因此,即使你用以下方式回答问题,你当前的脚本也会一直运行no
。由于createNewUser
是一个变量,因此您需要将其引用为$createNewUser
。 正如你所猜测的绝地确认,如果您希望脚本创建一个用户,然后询问您是否要创建另一个用户,则需要它在循环中询问您。这是另一种方法;我相信(恕我直言)这比绝地武士的回答:
/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
(因为两个语句之间用 分隔&&
)。只要您使用 bash,并且使用
[[
...]]
(而不是[
...]
),并且使用==
(而不是=
),测试的右侧就可以是一个模式,就像您用于路径名扩展的模式一样(即通配符/通配符)。通过测试,[[ "$createNewUser" == y* ]]
您的脚本将接受以 开头的任何输入y
,例如yes
、yeah
和yup
you bet!
请注意
y*
必须不是被引用,否则脚本将只接受文字字符串y*
。- 你应该总是引用你的 shell 变量引用(例如,
"$username"
),除非你有充分的理由不这样做,并且你确定你知道自己在做什么。严格来说,你可能不需要在[[ "$createNewUser" == y* ]]
测试中(bash 中测试中的第一个位置[[
被特殊处理),但是一般建议您养成总是这样做的习惯,除非您有真正的理由不这样做。 $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
成功或失败。)- 您不需要
{
和}
在"${firstname} ${lastname}"
。请参阅在 Bash 中使用单括号或双括号 讨论[[
...]]
与[
...]
以及何时需要使用。${variable_name}
您可能想要测试
firstname
或lastname
是否为空。例如,如果您正在为音乐家 Sting 创建帐户,并且您输入了Sting
他的名字而没有输入他的姓氏,那么他的名字将被保存为Sting
(末尾有一个空格)。考虑类似如果 [ “$firstname” = “” ] 然后 全名=“$姓氏” elif [ “$姓氏” = “”] 然后 全名=“$firstname” 别的 全名=“$firstname $lastname” 菲 useradd -g 员工 -c "$全名" -s /bin/bash "$用户名"
或者您可以只问一个问题,询问用户的全名。
- 您可能需要考虑将所有
read
语句切换为read -p
多种形式。