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

时间:2015-02-05 17:36:09

标签: regex bash conditional

我在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

谢谢,

布兰登

2 个答案:

答案 0 :(得分:2)

在比较之前,使用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

答案 1 :(得分:1)

您可以使用glob pattern检查开始文本/usr/

[[ "$prefix" == "/usr/"* ]]

*最后是glob来匹配/usr/之后的任何内容。

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