繁体   English   中英

具有grep命令理解的bash脚本

[英]bash script with grep command understanding

我之前发布过类似的内容。 我正在尝试使用$ ./user mburkhar命令(该命令打印出mburkhar is logged on来检查用户是否在线。 我的程序可以正常运行,但是如果我只键入$ ./user mb也会指出mb is logged on 我所拥有的没问题,但是有一种方法可以完全匹配用户键入的内容,而不是稍微匹配前两个字符..?

这是我的程序,因此您可以看到我的工作:

# Check if a user is logged on

if [ -z $1 ] ; then
    read user
else
    user=$1
fi

if [ `who | cut -d" " -f1 | grep $1` ] ; then
    echo "$1 is logged on"
else
    echo "$1 is either not valid or logged on"
fi

为了补充已接受的答案

-w可以很好地工作并且得到广泛支持(GNU Grep,BSD Grep),但是它不兼容POSIX

在你的情况,考虑到你的输出线包含各,没有别的, 使用一个用户名-x -要匹配行-将使意义太(它 POSIX兼容)。
另外,由于您要搜索文字用户名,因此,最好使用grep-F选项进行指示。

使用[ $(...) ] (或[ `...` ] )测试命令的非空输出有些脆弱且效率低下; 更好更简单:

  • 直接使用命令
  • 根据退出代码进行测试
  • 并在需要时抑制stdout输出

    • grep-q选项不仅抑制stdout,而且还可以通过在找到第一个匹配项后终止(退出代码为0表示成功)来终止搜索,从而可能提高搜索效率:

       if who | cut -d' ' -f1 | grep -Fxq "$1"; then # ... 

同样, [ -z $1 ]易碎,如果传递带有嵌入式空格的参数,则可能会中断-在这种情况下不太可能,但是最好养成使用[[ -z $1 ]]的习惯 (或者,如果您必须保持与POSIX兼容, [ -z "$1" ] )。
[[ ... ]] ,习惯性地双引号变量引用是有意义的,例如grep命令中的$1

如果我们将所有内容放在一起:

# Check if a user is logged on
if [[ -z $1 ]]; then
    read user
else
    user=$1
fi

if who | cut -d' ' -f1 | grep -Fxq "$1"; then
    echo "$1 is logged on"
else
    echo "$1 is either not valid or logged on"
fi

您可以使用grep的-w (-- --word-regexp )选项仅匹配整个单词。 在脚本中用grep -w $1替换grep $1应该可以解决。

指定字符串锚点的开始和结束,如下所示:

if [ -z $1 ] ; then
    read user
else
    user="^$1$"
fi

if [ $(who | cut -d" " -f1 | grep $user | uniq ) ] ; then
    echo "$1 is logged on"
else
    echo "$1 is either not valid or logged on"
fi

我还添加了uniq来删除重复的匹配项,以防用户获得多个tty,或者[将以以下方式退出: [: too many arguments

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM