用于比较目录的正则表达式模式

regex pattern for comparing directories

我正在处理 BASH 中的条件块,以防止用户同时使用 /usr/ 或 /usr/local 作为他们的安装前缀。如果前缀由用户准确键入 /usr/ 或 /usr/local,则下面的块有效,因此需要正则表达式。我使用的每个正则表达式模式似乎都不想工作。它们非常适合匹配文件但目录名称,不是那么多。

想法?

if [[ "$prefix" == "/usr/" || "$prefix" == "/usr/local/" ]];then
    echo "You're holding it wrong!"
    echo 'The install prefix cannot be in "/usr/" or "/usr/local/"'
    echo "Is the install prefix defined?"
    echo ""
    exit 1
fi

谢谢,

布兰登

您可以使用 glob 模式

检查起始文本 /usr/
[[ "$prefix" == "/usr/"* ]]

* 最后是 glob 来匹配 /usr/.

之后的任何内容

无需检查 "/usr/local/",因为它也以 /usr/ 开头。

在比较之前使用 readlink -f(或 realpath)规范化路径:

prefix=$(readlink -f "$prefix")

# note: no trailing /
if [[ "$prefix" == "/usr" || "$prefix" == "/usr/local" ]];then

这还有一个额外的优势,即可以捕捉到 /usr/usr/local 的符号链接以及 /opt/../usr 等愚蠢行为。如果您想禁止 /usr 下的所有位置,请使用(例如)

# note: trailing / is back. This is to make it possible to match for /usr/
# in the beginning so strange directories such as /usrfoo are not caught.
prefix=$(readlink -f "$prefix")/

if [ "$prefix" != "${prefix##/usr/}" ]; then
  # there was a /usr/ prefix to remove, so the directory was in /usr
fi