Shell-Script

使用 whoami 搜尋提及使用者的文件

  • October 8, 2018

我目前正在通過一些練習來嘗試改進我的 shell 腳本。腳本的要求如下:

  1. 它必須使用whoami命令獲取使用者名並將其儲存在一個名為 的變數中username
  2. 它必須採用一個參數,即要搜尋的文件的名稱。
  3. 它必須grep在指定的文件中搜尋使用者名的出現並列印出來。

這部分相對簡單,我使用以下方法使其工作:

username=$(whoami)
echo 'Enter the name of the file you would like to search: '
read fileName
cat "fileName" | grep "$username"

但是有一個問題,該練習說明了以下內容:

**注意:**對於此任務,無需擔心缺少錯誤檢查參數。除了 shebang 和您選擇添加的任何註釋之外,該腳本應由兩行組成。

我怎樣才能把它減少到只有兩行?

文件的路徑名作為參數給出。這意味著它是在腳本的命令行中給出的。這意味著您不應該以互動方式向使用者詢問它。

#!/bin/sh
grep -wF -e "$LOGNAME" "$1"

或者,如果您真的想使用whoami

#!/bin/sh
grep -wF -e "$(whoami)" "$1"

或者,對於“兩行”要求:

#!/bin/sh
name=$(whoami)  # or:  name=$LOGNAME
grep -wF -e "$name" "$1"

或者,如果我們想在第一行做一些有用的事情:

#!/bin/sh
[ ! -f "$1" ] && { printf 'No such file: %s\n' "$1" >&2; exit 1; }
grep -wF -e "$(whoami)" "$1"

使其僅匹配完整單詞 的-w選項。會匹配但不匹配。grep``grep -w 'AA'``AA``AAA

使實用程序將給定表達式作為固定字元串而不是正則表達式的-F選項。grep

-e選項表示命令行上的下一個字元串是模式。沒有它,以破折號開頭的模式可能會被錯誤地解釋為一組命令行選項。

$LOGNAME$USER在許多系統上)變數保存目前使用者的使用者名。

的值$1是在命令行上給腳本的第一個命令行參數。

另請注意,我們可以使用/bin/sh而不是使用執行此腳本,bash因為此腳本不使用特殊的bash特定外殼擴展。它顯然會在bash……


請注意,上述內容不搜尋提及特定使用者的文件(如問題標題中所示),而是搜尋文件中提及該使用者的行。

要在命令行給定的目錄中搜尋提及目前使用者的文件:

#!/bin/sh
find "$1" -type f -exec grep -q -wF -e "$LOGNAME" {} ';' -print

與最後一部分相關:

引用自:https://unix.stackexchange.com/questions/473947