带有退出代码语句的 If 语句

带有退出代码语句的 If 语句

我是 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

  1. 然后显示grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'ANDecho is NOT currently logged on 然后以代码 1 结束脚本。

如果用户已登录(将返回退出代码 0):who | grep $userid

  1. 然后显示grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'ANDecho is currently logged on 然后以代码 0 结束脚本。

判断用户是否有效:

如果用户无效(将返回退出代码 1):grep $userid /etc/passwd

  1. 然后它应该显示echo "The user you entered, $userid is not a valid user on this system."

如果用户有效(将返回退出代码 0):grep $userid /etc/passwd

我该如何编写这个脚本?完整的结构是怎样的?我被困在结构/设置上。

答案1

由于这看起来像是一项作业,我只会为您提供工具和一些提示:

  1. 如果没有为脚本提供参数,则$1(脚本的第一个参数)将为空。您可以使用 来测试这一点[[ -z $1 ]]。如果您想显示错误太多参数,测试参数的数量[[ $# -eq 1 ]](对于单个参数来说是正确的)。

  2. gentent passwd "$username"命令可用于获取passwd用户的条目$username。如果用户不存在,该命令将失败并返回非零退出状态。这意味着您可以使用if ! getent passwd "$username" >/dev/null; then ...; fi对不存在的用户做出反应$username

  3. passwd用户条目的第 5 个字段通常包含用户的全名(实际上不能保证它将采用“名字姓氏”形式)。该条目末尾可能有多余的逗号,您必须将其删除。您可以解析getent passwd "$username"using的输出cut -d: -f 5来获取第五个字段,然后使用 删除第一个逗号name=${name%%,*}

    在某些系统上,用户的全名可能包含一个&字符。在这些系统上,该&字符应替换为用户名(以便System &用户的名称operator变为System operator)。我不确定 Linux 通常会这样做,但这可以通过name=${name/&/$username}.

  4. who实用程序输出当前登录的用户列表。要$username与之匹配,请使用grep -e "^$username\>".匹配\>单词的结尾,因此antony在查找 或 时,eg 不匹配antongrep -q在声明中很有用if

代码结构如下:

  1. 检查并处理无效参数(缺少:读取;太多:退出或先使用)。一份if声明。
  2. 检查并处理无效的用户名。一份if声明。
  3. 获取用户的全名。通过命令替换进行变量赋值。
  4. 检查用户是否登录(和输出)。一份if声明,可能有一个else分支。

我在这个脚本中没有看到循环,因此它将是许多if- 语句和变量赋值。

相关内容