我在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
谢谢,
布兰登
答案 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/
开头。