$!/bin/sh
if grep "$1" /etc/passwd 2>/dev/null #Search username at beging of line1
then
echo "Pattern found - Job Over"
else
echo "Pattern not found"
fi
答案1
在bash中,1表示stdout,2表示stderr(标准错误流)
/dev/null 是一个虚拟设备,您可以向其中写入任何内容,并且它将消耗所有内容(本质上是消除输出)。
因此,2> /dev/null
这意味着将此命令的错误输出重定向到 /dev/null。本质上的意思是,去掉错误消息
答案2
目的2>/dev/null
是隐藏通过grep
将任何诊断消息重定向到/dev/null
(丢弃写入其中的数据的特殊设备文件)而产生的错误。
该/etc/passwd
文件通常可供所有用户读取,因此我不太明白为什么需要重定向错误流。但是,由于代码grep
在if
语句中使用,实用程序可能产生的输出(匹配 的行$1
)可能是不需要的,并且>/dev/null
此输出将被丢弃。因此,我建议2
代码中的 是一个拼写错误,作者打算写
#!/bin/sh
if grep -e "$1" /etc/passwd >/dev/null; then
echo "Pattern found - Job Over"
else
echo "Pattern not found"
fi
也就是说,对于echo
任一字符串,同时丢弃匹配的实际行。-e
如果字符串$1
以破折号开头,则需要。另请注意更正后的#!
- 行。
这也可以在没有任何重定向的情况下完成:
#!/bin/sh
if grep -q -e "$1" /etc/passwd; then
echo "Pattern found - Job Over"
else
echo "Pattern not found"
fi
一旦找到匹配项就会退出,并且也会使其安静(它不输出匹配的行 )-q
。grep
如果这是grep
为了用户名中/etc/passwd
,然后使用
if getent passwd "$1" >/dev/null; then ...; fi
会是一个更好的选择,因为使用纯文本grep
可能会找到包含字符串作为$1
子字符串的用户名,除非您小心地正确编写表达式(正则表达式实际上并未显示在问题中)。getent passwd
如果在数据库中找不到给定的用户名,则该命令将以非零退出状态退出passwd
。
这也适用于使用 NIS 或 LDAP 数据库存储用户信息的系统,但会不是在 macOS 上工作(无getent
实用程序)。