查找用户是否已登录uisng shell脚本

时间:2017-05-22 07:06:53

标签: bash shell

我有一个小的shell脚本,用于测试是否使用if条件登录的条件。

#!/bin/bash

if [  $# -ne 1 ]
then
        echo "Argument required"
        echo "Usage: on user"
else
        user="$1"

        if  who | grep ^"$user " > /dev/null
        then
                echo "$user is logged in"
        else
                echo "$user is not logged in"
        fi
fi

这样可以正常工作。

现在这里是我的问题:如果我尝试这个,如果下面的方法条件意味着shell终端通过错误。

 if [ who | grep ^"$user " > /dev/null ]

> Error ./user.sh: line 10: [: missing `]'
  grep: ]: No such file or directory
你可以告诉一下这两个测试条件之间有什么区别吗?

2 个答案:

答案 0 :(得分:2)

简单来说,[test测试表达式的结果,而不是命令列表

以下是testif的语法:

  

test expr   [expr]

     

如果列表;然后列出; [elif list;然后列出; ] ... [else list; ] fi

然后在if构造中,可以跟随命令列表

因此,在if who | grep ^"$user " > /dev/null中,它执行命令who | grep ^"$user " > /dev/null,然后测试命令的返回状态

但是在if [ who | grep ^"$user " > /dev/null ]中,它首先执行命令[ who | grep ^"$user " > /dev/null ],但是因为|(管道),它的命令将被解析作为两部分
1:[ who,它会抱怨:“第10行:[:缺少`]'” 第二名:grep ^"$user " > /dev/null ]会抱怨:“grep:]:没有这样的文件或目录”。

至于[test表达式的格式: 参考The classic test command。主要的四个表达方式是: 文件测试字符串测试算术测试 misc测试

答案 1 :(得分:0)

使用功能。

#!/bin/bash

logged_in () { who | grep ^"$1 " > /dev/null; }

if [  $# -ne 1 ]
then
    echo "Argument required"
    echo "Usage: on user"
else
    user="$1"

    if logged_in "$user"
    then
        echo "$user is logged in"
    else
        echo "$user is not logged in"
    fi
fi