我不得不编写一个subversion钩子脚本代码,我在网上找到了一些例子,主要是python和perl。我发现了一个或两个shell脚本(bash)。我很困惑,我很抱歉这是一个非常基本的问题。
FILTER=".(sh|SH|exe|EXE|bat|BAT)$"
该脚本稍后使用它来执行测试,例如(假设EXT = ex):
if [[ "$FILTER" == *"$EXT"* ]]; then blah
我的问题是上面的测试是真的。但是,我并没有要求你协助编写脚本,只是解释了FILTER的初始分配。我不明白那条线。
在更近的示例中编辑FILTER行。当然,编写的脚本不起作用,因为'ex'返回true,而不仅仅是'exe'。但是,我的问题只是我不了解变量赋值本身的布局。
为什么一开始就有一段时间? “(SH ...”
为什么最后会有一个美元符号? “...... BAT)$”
为什么每个模式之间都有管道? “SH | SH | EXE”
答案 0 :(得分:2)
你可能正在寻找下一个东西:
FILTER="\.(sh|SH|exe|EXE|bat|BAT)$"
for EXT
do
if [[ "$EXT" =~ $FILTER ]];
then
echo $EXT extension disallowed
else
echo $EXT is allowed
fi
done
将其保存到myscript.sh
并将其作为
myscript.sh bash ba.sh
并将获得
bash is allowed
ba.sh extension disallowed
如果你没有逃脱" dot",例如使用FILTER=".(sh|SH|exe|EXE|bat|BAT)$"
即可获得
bash extension disallowed
ba.sh extension disallowed
什么(当然)错了。
问题:
为什么一开始就有一段时间? "(SH ..."
因为你想要匹配.sh
(作为扩展名)而不是例如bash
(没有点)。因此.
必须转发,例如\.
,因为正则表达式中的.
表示"任何字符。
Why is there a dollar sign at the end? "...BAT)$"
$
mean =字符串结尾。您希望匹配file.sh
而不是file.sh.jpg
。 .sh
应该在字符串的末尾。
Why are there pipes between each pattern? "sh|SH|exe"
在rexex中,(...|...|...)
构造界定了"替代品"。你肯定有问题。
你真的需要阅读一些"正则表达式教程" - 它更复杂 - 并且无法在一个答案中解释。
Ps:永远不要使用UPPERCASE变量名,它们可能会与环境变量发生碰撞。
答案 1 :(得分:1)
这只是为FILTER
分配一个字符串;该字符串的内容没有特殊含义。当您尝试将其与模式*ex*
匹配时,假设$FILTER
的值包含由任意一侧的任何内容包围的字符串ex
,则结果为true。这是真的; ex
是exe
的子字符串。
FILTER=".(sh|SH|exe|EXE|bat|BAT)$"
^^
|
+---- here is the "ex" from the pattern.
答案 2 :(得分:0)
尽管如此,这与正则表达式模式类似:
在正则表达式中,字符串start with可以用^显示,在这种情况下类似。代表似乎正在这样做。
在括号中,您有精确的字符串,表示匹配的确切文件扩展名,使用“|”表示“或”。
最后,表达式应该只选择字符串'$'或终点而不是更多。
我会说原作者可能已经看过它并实现了它。