匹配以单个字母开头的用户

匹配以单个字母开头的用户

我曾收到别人写的一份脚本,并被要求根据他们的需求进行修改。其中有一行需要修改:

if [ "$user" == "nobody" ] 

这需要扩展以包括以字母 p、u 和 z 开头的其他用户。字母后面的所有用户帐户都是一串随机数,即p33783201。我已经在 Google 上搜索了几个小时,但我的理解不足开始让我感到困惑。

谢谢!

答案1

在正则表达式中,“字母 p、u 或 z”为[puz],数字为[0-9],数字序列通常为[0-9]+(一个或多个)(如果您使用支持它的正则表达式语法)或[0-9][0-9]*(零个或多个)(如果您被迫使用不支持它的 POSIX Basix Regex)。最后添加^...$要求完全匹配(将匹配锚定到字符串的开头和结尾,而不仅仅是其中的任何地方)。

正如你用,假设它是一个#!/usr/bin/env bash脚本,您可以使用 Bash 的[[正则表达式匹配运算符=~(使用 POSIX 扩展正则表达式语法):

if [[ $user == nobody || $user =~ ^[puz][0-9]+$ ]]; then

if [[ $user =~ ^(nobody|[puz][0-9]+)$ ]]; then

如果它不是 Bash 而是#!/bin/sh“POSIX shell”脚本,您可以用expr它来执行相同的任务(仅限于 POSIX Basic 正则表达式方言并且没有+):

if [ "$user" = nobody ] || expr "$user" : "^[puz][0-9][0-9]*$" > /dev/null; then

或者甚至是 grep (如果性能不是一个大问题,也可以使用其他 20 多个支持正则表达式的工具):

if [ "$user" = nobody ] || (echo "$user" | grep -qs "^[puz][0-9][0-9]*$"); then

if echo "$user" | grep -Eqs "^(nobody|[puz][0-9][0-9]*)$"

请注意,[应该使用单个=,尽管 shell 通常接受==

相关内容