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