0

我正在创建一个脚本来检测哪个用户有一段时间没有连接到服务器。

到目前为止一切都很好,但现在试图从我的脚本生成的列表中删除一些不需要的条目。我想在我的脚本中添加一个异常,以便在使用未使用的参数调用 lastlog 时,输出不会打印到屏幕上。

我试过类似的东西:

if [ $? -gt 0 ]; then
    echo "ERROR!"
fi

但问题是 lastog 在成功时返回 0 但很简单:

lastlog: Unknown user or range: infolog

关于错误。所以我无法捕捉到例外。

这是我的代码(非常简单)

#!/bin/bash
FILES=../*

for year in 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012
do
    for f in $FILES
    do
        tempUser=${f:3:20}
        userCommand=`lastlog -u $tempUser | grep $year`

        if [ ${#userCommand} != 0 ]   
        then
          echo "$userCommand"
        fi

    done
done
4

1 回答 1

1

您可以非常简单地对此进行测试,但在我方便的 linux 机器lastlog上确实为错误的用户名设置了非零状态:

$ if lastlog -u nosuchuser; then echo no error; else echo error; fi
lastlog: Unknown user or range: nosuchuser
error

如果您在管道中运行它,问题在于管道序列的“状态”是管道最后一个元素的状态:

$ progA | progB | progC
$ echo $?

打印 progC 的状态。

PIPESTATUS如果您使用 bash,则可以通过 bash 的数组变量从所有内容中获取状态:

bash$ progA | progB | wc
bash: progB: command not found
bash: progA: command not found
      0       0       0
bash$ echo ${PIPESTATUS[@]}
127 127 0
bash$

这应该可以让您继续前进。


编辑:您甚至可能不在乎,只是在寻找一种方法来丢弃 stderr 的输出lastlog,在这种情况下,请考虑:

$ lastlog 2>/dev/null | grep ...
于 2012-04-29T22:22:26.187 回答