我是 Linux/Unix 的初学者。这是我的作业,在这里发布所有内容太长了:https://i.stack.imgur.com/v2AJR.jpg
这是我的逻辑:
此代码将检查用户是否输入了参数。我不知道该把什么放在别的下面。我们从未讨论过我从另一个用户那里学到的which语句,因此预计不会使用它。只是基本命令,这不是一个超级高级的任务。
if [ $# -ne 1 ]; then
echo Please enter a single, valid user id:
read userid
else
userid=$1
**what goes here?**
fi
要显示用户的全名(即本·富兰克林),这是我编写和测试的代码:
grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'
判断用户是否登录:
如果用户未登录(将返回退出代码 1):who | grep $userid
- 然后显示
grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'
ANDecho is NOT currently logged on
然后以代码 1 结束脚本。
如果用户已登录(将返回退出代码 0):who | grep $userid
- 然后显示
grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'
ANDecho is currently logged on
然后以代码 0 结束脚本。
判断用户是否有效:
如果用户无效(将返回退出代码 1):grep $userid /etc/passwd
- 然后它应该显示
echo "The user you entered, $userid is not a valid user on this system."
如果用户有效(将返回退出代码 0):grep $userid /etc/passwd
我该如何编写这个脚本?完整的结构是怎样的?我被困在结构/设置上。
答案1
由于这看起来像是一项作业,我只会为您提供工具和一些提示:
如果没有为脚本提供参数,则
$1
(脚本的第一个参数)将为空。您可以使用 来测试这一点[[ -z $1 ]]
。如果您想显示错误太多参数,测试参数的数量[[ $# -eq 1 ]]
(对于单个参数来说是正确的)。该
gentent passwd "$username"
命令可用于获取passwd
用户的条目$username
。如果用户不存在,该命令将失败并返回非零退出状态。这意味着您可以使用if ! getent passwd "$username" >/dev/null; then ...; fi
对不存在的用户做出反应$username
。passwd
用户条目的第 5 个字段通常包含用户的全名(实际上不能保证它将采用“名字姓氏”形式)。该条目末尾可能有多余的逗号,您必须将其删除。您可以解析getent passwd "$username"
using的输出cut -d: -f 5
来获取第五个字段,然后使用 删除第一个逗号name=${name%%,*}
。在某些系统上,用户的全名可能包含一个
&
字符。在这些系统上,该&
字符应替换为用户名(以便System &
用户的名称operator
变为System operator
)。我不确定 Linux 通常会这样做,但这可以通过name=${name/&/$username}
.该
who
实用程序输出当前登录的用户列表。要$username
与之匹配,请使用grep -e "^$username\>"
.匹配\>
单词的结尾,因此antony
在查找 或 时,eg 不匹配anton
。grep -q
在声明中很有用if
。
代码结构如下:
- 检查并处理无效参数(缺少:读取;太多:退出或先使用)。一份
if
声明。 - 检查并处理无效的用户名。一份
if
声明。 - 获取用户的全名。通过命令替换进行变量赋值。
- 检查用户是否登录(和输出)。一份
if
声明,可能有一个else
分支。
我在这个脚本中没有看到循环,因此它将是许多if
- 语句和变量赋值。