互动脚本
该脚本应询问用户想要创建的帐户数量以及名称前缀。那么它应该创建用户指定的帐户数量,但应该跳过任何已创建的用户
即 user03 存在,如果存在则跳到下一个可用号码,即 user04 或 user05。********
这是我已经编写的脚本,但无法按应有的方式工作:
#!/bin/bash
Clear
Declare -I num
Start=1
Echo -n “Enter number of accounts to be created: “
Read num
Echo -n “Enter user prefix: (student or user)”
Read pre
Echo “”
For I in { $num }
Do
Echo “Adding user”
Useradd -m $pre$num
((num++))
done
答案1
您似乎在文字处理程序中编写了脚本,其中包含不应大写的单词(Unix 上的命令名称区分大小写),并使用了精美的印刷双引号(“...”
而不是"..."
)。请考虑使用更简单的文本编辑器(例如nano
、emacs
或 )编写脚本vim
。网站https://www.shellcheck.net/对于发现脚本中更简单的错误非常有帮助。
以此作为提示,所有命令名称都应为小写,并且您需要更改引号。
你的循环也有点奇怪。一方面,您似乎想要循环{ $num }
(我不知道这意味着什么),另一方面,您num
在循环内递增。请注意,这num
是用户输入的数字,因此增加它是没有意义的。假设您更新循环中的变量:
number=1
while [ "$num" -ne 0 ]; do
# code here that increments "number",
# and conditionally decrements "num"
done
请记住,您必须跟踪用户名中使用的号码也创建的用户数。您需要这样做才能知道何时创建了正确数量的用户,并且能够跳过系统上已存在的用户名。这里我选择递减 num
直到它达到零,同时将用户名中使用的数字保留在名为 的变量中number
。
在循环内部,你必须尝试创建 user $pre$number
,如果成功,则递减num
.在每次迭代中,您总是递增number
。您迭代直到num
达到零,这意味着您已经创建了所有用户。
假设adduser
成功和失败返回一个正常的退出状态(注意:我不是 Linux 用户,所以我不知道如果你尝试创建一个已经存在的用户,在 CentOS 上会发生什么),你可以使用添加一个用户
if adduser -m "$pre$number"; then
# adduser succeeded, we've created a new user, decrement num
num=$(( num - 1 ))
fi
number=$(( number + 1 ))
或者,你可以检查建议的用户名是否存在首先使用getent
:
if ! getent passwd "$pre$number" >/dev/null; then
# the user don't exist, create it
adduser -m "$pre$number"
num=$(( num - 1 ))
fi
number=$(( number + 1 ))
getent passwd
如果系统中不存在给定的用户名,则命令将失败。我们在此利用这一事实来避免使用adduser
现有用户名进行调用。
我将忽略脚本开头的大部分代码,但我只是指出num
不需要声明为整数,并且read -p 'prompt' var
通过特定提示从用户读取值,因此echo
不需要这些语句。
您可能还需要考虑这样一个事实:$pre
代码中的字符串实际上被接受,即使它可能不是字符串student
或user
(正如当前代码的输出表明它应该是)。
您还应该考虑$pre
用户名可能无效的情况,例如,当它包含空格时。根据您编写代码的方式,如果您不检查它$pre$number
是否作为用户名,这可能意味着无法创建任何帐户,或尝试创建无限数量的帐户。