use*_*own 5 bash string regular-expression
我有问题要了解与字符串模式匹配=〜在庆典。
我编写了以下函数(不要惊慌 - 这只是试验,不是 md5sum 的安全方法):
md5 () {
[[ "$(md5sum $1)" =~ $2* ]] && echo fine || echo baarr;
}
Run Code Online (Sandbox Code Playgroud)
并用一些输入对其进行了测试。这里有一些参考:
md5sum wp.laenderliste
b1eb0d822e8d841249e3d68eeb3068d3 wp.laenderliste
Run Code Online (Sandbox Code Playgroud)
如果控制和的源不包含文件名的两个空格,则不必要地难以比较。这就是观察的来源,但比解决该问题的多种方法更有趣的是我的观察:
我定义了一个控制变量,并用太短但匹配的字符串测试我的函数:
ok=b1eb0d822e8d841249e3d68eeb3068d3
for i in {29..32}; do md5 wp.laenderliste ${ok:1:$i} ;done
fine
fine
fine
fine
Run Code Online (Sandbox Code Playgroud)
这是预期的并且很好,因为它是函数的目的,忽略丢失的“wp.laenderliste”的不匹配,因此甚至更长的不匹配。
现在,如果我添加不匹配的随机内容,我当然希望出现错误,并得到它们:
for i in {29..32}; do md5 wp.laenderliste ${ok:1:$i}GU ;done
baarr
baarr
baarr
baarr
Run Code Online (Sandbox Code Playgroud)
正如预期的那样。但是当只有一个最后一个不匹配的字符时,看看会发生什么:
for i in {29..32}; do md5 wp.laenderliste ${ok:1:$i}G ;done
fine
fine
fine
fine
Run Code Online (Sandbox Code Playgroud)
这是我,没有意识到这应该如何工作(select 坏了),还是在 bash 的模式匹配中真的存在一个错误?
字符串中间的不匹配从计数 1 开始:
for i in 5 9 e ; do echo md5 wp.laenderliste ${ok//$i/_} ;done
md5 wp.laenderliste b1eb0d822e8d841249e3d68eeb3068d3
md5 wp.laenderliste b1eb0d822e8d84124_e3d68eeb3068d3
md5 wp.laenderliste b1_b0d822_8d841249_3d68__b3068d3
for i in 5 9 e ; do md5 wp.laenderliste ${ok//$i/_} ;done
fine
baarr
baarr
Run Code Online (Sandbox Code Playgroud)
bash 版本:
bash -version
GNU bash, Version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
Lizenz GPLv3+: GNU GPL Version 3 oder jünger <http://gnu.org/licenses/gpl.html>
Run Code Online (Sandbox Code Playgroud)
免责声明: md5sum 仅用于防止无意错误,而不用于防止攻击。我不鼓励使用它。
这个问题不是寻找更好的解决方案或变通方法。它是关于=~运算符,它是否应该像它那样运行,如果是,为什么。
ilk*_*chu 10
=~
in ( [[ ]]
) 是一个正则表达式模式匹配(或者更确切地说,一个搜索,见下文)。这与=
(or ==
) 使用与文件名通配符相同的模式不同。
特别是,正则表达式中的星号表示“前一个单元的零个或一个副本”,因此abc*
表示ab
加上零个或多个c
s。
在您的情况下,尾随星号使函数参数的最后一个字符可选。在您的最后一个示例中,模式变为...68d3G*
,并且由于G*
匹配空字符串,因此它匹配像...68d3
. “任何字符串”的正则表达式是.*
,或“任何字符,任意次数”。
请注意,正则表达式匹配搜索字符串中任何位置的匹配项,它不需要是整个字符串。所以模式cde
将在字符串中找到abcdefgh
。
你可能想使用这样的东西:
[[ "$(md5sum "$1")" = "$2 "* ]] && echo ok
Run Code Online (Sandbox Code Playgroud)
我们真的不需要这里的正则表达式匹配,因为md5sum
无论如何输出尾随空格(加上文件名),我们可以在模式中使用它来检查我们是否与完整模式匹配。所以给函数一个截断的散列是不匹配的。