这个变量赋值是做什么的?

时间:2014-08-18 18:26:47

标签: bash shell variables

我不得不编写一个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”

3 个答案:

答案 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。这是真的; exexe的子字符串。

FILTER=".(sh|SH|exe|EXE|bat|BAT)$"
                ^^
                |
                +---- here is the "ex" from the pattern.

答案 2 :(得分:0)

尽管如此,这与正则表达式模式类似:

在正则表达式中,字符串start with可以用^显示,在这种情况下类似。代表似乎正在这样做。

在括号中,您有精确的字符串,表示匹配的确切文件扩展名,使用“|”表示“或”。

最后,表达式应该只选择字符串'$'或终点而不是更多。

我会说原作者可能已经看过它并实现了它。