使用 whoami 搜索提及用户的文件

Nig*_*ard 7 grep shell-script filenames whoami

我目前正在通过一些练习来尝试改进我的 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"
Run Code Online (Sandbox Code Playgroud)

但是有一个问题,该练习指出以下内容:

注意:对于此任务,无需担心缺少错误检查参数。除了shebang 和您选择添加的任何注释之外,脚本应该由两行组成。

如何将其减少到只有两行?

Kus*_*nda 10

文件的路径名作为参数给出。这意味着它是在脚本的命令行上给出的。这意味着您不应该以交互方式向用户询问它。

#!/bin/sh
grep -wF -e "$LOGNAME" "$1"
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/sh
grep -wF -e "$(whoami)" "$1"
Run Code Online (Sandbox Code Playgroud)

或者,对于“两行”要求:

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

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

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

使其仅匹配完整单词的-w选项grepgrep -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
Run Code Online (Sandbox Code Playgroud)

与最后一部分相关: