用于比较目录的正则表达式模式
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
我正在处理 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