簡體   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