Check in shellscript if a variable is partially the same as a parameter
因此,这是公认的为大学,但我找不到答案在任何地方,在线,也没有在课堂笔记。
我基本上取一个参数,并且必须搜索,如果这是我已经存储的较长字符串的一部分:
1 2 3
| if [ *$param* = $var ]
then
... |
是有问题的部分。现在对我来说真正奇怪的是,不管它说=还是!=嵌套在下的代码永远不会执行。我非常彻底地检查了代码的每一个其他部分,看起来都工作得很好。
你知道什么会导致这个吗?
- 此外,这里还有一个到高级bash脚本指南的链接,我以前(现在仍然如此)多次求助于它。
- @萨尔,请不要向其他人建议abs——这是臭名昭著的不良实践例子和过时信息的来源(而且已经有好几年了——请参阅woledge.org/~greybot/meta/abs中irc.freenode.org bash factid数据库条目旁边的时间戳;它们是划时代的,因此bash的建议是从2008年开始跳过abs)。bash黑客的wiki和bashguide是更好维护的替代方案;bashfaq中也有很多内容重叠。
- @查尔斯达菲谢谢你的额外指点,我会亲自检查的!
你只需要颠倒论点。如果右侧操作数包含诸如*和?之类的未转义元字符或括号表达式[...],则在[[ ... ]]、=、==和!=内部可以执行模式匹配。
1
| if [[ $var == *"$param"* ]]; # check if $param is a substring of $var |
您的代码可能执行过模式匹配,也可能没有执行过模式匹配(取决于$var的内容),但是您看到了嵌入在文字*中的值为$param的字符串是否与$var的值匹配。
例如,[[ foobar == *oba* ]]会成功,因为oba是foobar的子串。由于*oba*和foobar是两个不同的字符串,因此[[ *oba* == foobar ]]不会。[[ *oba* == *oba ]]也会失败,因为*oba*不是以oba结尾的字符串。
- 注意,对于严格匹配,您应该将变量放在右边的双引号中(而不是通配符!)如:[[ $var == *"$param"* ]]。这将强制字符串中的任何通配符类型字符按字面匹配。
试试这个
1 2 3
| if [[ $var =~ $param ]]; then
echo"matches"
fi |
- 这是一个regex,而不是glob——一个非常不同的语法。
- …例如,如果param='.txt'与[[ $var =~ $param ]]匹配,即使a不是.(因为.在posix-ere-regex语法中是单字符通配符);而[[ $var = *"$param"* ]]只与精确的子字符串匹配。
我会用grep
1 2 3
| if echo $var | grep -q $param; then
echo"found it!"
fi |
- 相当麻烦——如果你的param包含空格,或者你的var包含两个字符串-n,那么试试这个。(同样,旋转管道意味着你至少要旋转两次,然后用一个execve()来替换一个分叉的子壳,用一个grep的实例来代替外壳本身可以做的事情)。