我曾收到别人写的一份脚本,并被要求根据他们的需求进行修改。其中有一行需要修改:
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 通常接受==
。