Shell-Script
使用 whoami 搜尋提及使用者的文件
我目前正在通過一些練習來嘗試改進我的 shell 腳本。腳本的要求如下:
- 它必須使用
whoami
命令獲取使用者名並將其儲存在一個名為 的變數中username
。- 它必須採用一個參數,即要搜尋的文件的名稱。
- 它必須
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
與最後一部分相關:
- 了解
find
的 -exec 選項man grep
在您的系統上。