我目前正在进行一些练习,试图改进我的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和您选择添加的任何注释之外,脚本应该由两行组成。
我怎样才能把这个减少到两行呢?
发布于 2018-10-08 11:03:52
文件的路径名作为参数给出。这意味着它是在脚本的命令行中给出的。这意味着您不应该以交互方式向用户询问。
#!/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-specific shell扩展。很明显,它在bash下运行得也很好.
请注意,上面没有搜索提到特定用户的文件(如问题的标题),而是搜索提到该用户的文件中的行。
要搜索命令行上给定的目录中提到当前用户的文件,请执行以下操作:
#!/bin/sh
find "$1" -type f -exec grep -q -wF -e "$LOGNAME" {} ';' -print与最后一部分有关:
findman grep在你的系统上。发布于 2018-10-08 11:08:04
最简单的解决办法:
#!/bin/bash
username=$(whoami)
grep $username $1您可以为grep提供一个文件名作为可选参数(请参阅man grep)。变量$1引用脚本的第一个位置参数。
你这样称呼它:
name-finder.sh filename你甚至可以把它做成一条线:
username=$(whoami); grep $username $1或
grep $(whoami) $1https://unix.stackexchange.com/questions/473947
复制相似问题