Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用于比较目录的正则表达式模式_Regex_Bash_Conditional - Fatal编程技术网

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

Regex 用于比较目录的正则表达式模式,regex,bash,conditional,Regex,Bash,Conditional,我正在处理BASH中的一个条件块,它阻止用户同时使用/usr/或/usr/local作为安装前缀。如果用户准确地键入了前缀/usr/或/usr/local,则下面的块可以工作,因此需要正则表达式。我使用的每个正则表达式模式似乎都不想起作用。它们在匹配文件方面非常有效,但在匹配目录名方面效果不太好 想法 if [[ "$prefix" == "/usr/" || "$prefix" == "/usr/local/" ]];then echo "You're holding it wrong

我正在处理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
谢谢


Brandon

您可以使用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
下的所有位置,请使用(例如)


但是没有操作写入块
/usr/
?正确。我刚刚看到了我的错误所在。我想,如果我发布了我尝试过的正则表达式模式的示例,会有所帮助:)错误是我把*通配符放在强引号内,而不是外面。谢谢我刚刚测试了这个,它可以工作:如果[[“$prefix”==”/usr/“*]”,我不希望用户能够在/usr/*中安装代码,因为它可能/将在其他开发人员构建代码时破坏他们的代码。我还添加了一个force参数,这样开发人员仍然可以在/usr/*中安装,例如,如果他们正在生产服务器上安装,并且需要在/usr/*中安装代码。虽然这需要sudo访问权限,但我不只是分发:)谢谢大家@BrandonEss:所以一个愚蠢的用户会使用
//usr/
作为他的前缀。如果您使用这个解决方案,您当然不需要费心添加一个force参数<代码>:D。谢谢你的提示。我的脚本需要在RHEL5/6/7和Ubuntu 1204/1404+上运行:)@rici哦,好的。我添加了一个关于
readlink
的注释,您可以使用它来达到相同的效果
readlink
是coreutils的一部分,因此我认为它应该在任何地方都可用。嗯……不过,再看一眼,
realpath
也是如此<代码>读链接比较旧,我刚刚检查过,realpath似乎安装在RHEL5/6/7和Ubuntu 1204上。我认为它可以节省使用。
realpath
似乎有几个不完全兼容的版本的漫长而复杂的历史,所以我想我会将示例改为支持
readlink-f
,并留下关于realpath的旁注。对于这种情况,两种方法都应该有效。@Wintermute谢谢,我添加了readlink检查,它使正则表达式匹配更加健壮。
/usr/acceptable
可以接受吗?
# 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