-4 grep
echo "$password" | grep -q [A-Z]
Run Code Online (Sandbox Code Playgroud)
-q这个命令的作用是什么?
-q告诉grep一旦找到与模式匹配的行就以成功退出状态退出,如果在任何输入中都没有找到匹配行则以失败状态退出,否则不在标准输出上打印任何内容。
它通常用于以下情况:
if grep -q foo file; then
echo file contains foo
fi
Run Code Online (Sandbox Code Playgroud)
或者:
find . -type f -exec grep -q foo {} \; \
-exec printf '"%s" contains foo\n' {} \;
Run Code Online (Sandbox Code Playgroud)
或者:
<"$file" grep -q -xFe "$expected_line" ||
die "Expected line not found in $file"
Run Code Online (Sandbox Code Playgroud)
在这里,您的代码示例由于以下几个原因是错误的:
[A-Z]也是一个 shell glob 运算符,因此应该加引号,以便[A-Z]将参数按字面意思传递给grep. 例如,如果当前目录中有名为A、Z和 的文件X,shell 会将 扩展[A-Z]到这些文件,因此您最终会运行在和文件中grep -q A X Z查找的文件。AXZ[A-Z]随区域设置的不同而变化,并且通常或多或少是随机的。ABCDEFGHIJKLMNOPQRSTUVWXYZ要按照使用者通常的意图来匹配任一字母[A-Z],您需要[ABCDEFGHIJKLMNOPQRSTUVWXYZ].echo不能用于输出任意数据,因为具体取决于实现,它会破坏包含反斜杠和/或以-.grep未指定,因此您可能需要首先检查$password在用户区域设置中是否为有效文本。所以在这里:
if
printf '%s\n' "$password" | grep -q '[ABCDEFGHIJKLMNOPQRSTUVWXYZ]'
then
echo the password contains at least one ASCII uppercase letter
fi
Run Code Online (Sandbox Code Playgroud)
或者:
if
printf '%s\n' "$password" | grep -q '[[:upper:]]'
then
echo "the password contains at least one letter considered uppercase in the user's locale"
fi
Run Code Online (Sandbox Code Playgroud)
会更正确。虽然在 POSIX shell 中,你不需要grep,你可以这样做:
case $password in
(*[ABCDEFGHIJKLMNOPQRSTUVWXYZ]*) echo contains ASCII uppercase;;
(*[[:upper:]]*) echo no ASCII uppercase, but some other uppercase;;
(*) echo no uppercase;;
esac
Run Code Online (Sandbox Code Playgroud)