[英]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.