【问题标题】:Check in shellscript if a variable is partially the same as a parameter [duplicate]如果变量与参数部分相同,请检查 shellscript [重复]
【发布时间】:2019-04-19 22:06:36
【问题描述】:

所以这当然是针对大学的,但我在任何地方、网上、讲义中都找不到答案。

我基本上采用一个参数,并且必须搜索,如果它是我已经存储的较长字符串的一部分:

if [ *$param* = $var ]
then
...

是有问题的部分。现在对我来说真正奇怪的是,无论它说 = 还是 !=,嵌套在 then 下的代码都不会被执行。我非常彻底地检查了代码的所有其他部分,看起来一切正常。

您有什么想法会导致这种情况吗?

【问题讨论】:

  • 另外,这里有一个指向Advanced Bash-Scripting Guide 的链接,我过去曾多次求助(现在仍然如此)。
  • @sal,请不要向其他人建议 ABS——它作为不良做法示例和过时信息的来源而臭名昭著(多年来一直如此——查看 wooledge.org/~greybot/meta/abs 中 irc.freenode.org #bash factoid 数据库条目旁边的时间戳;它们处于纪元时间,因此 #bash 建议从 ~2008 年开始跳过 ABS)。 bash-hackers' wiki 和 BashGuide 是维护得更好的替代品; BashFAQ也有很多内容重叠。
  • @CharlesDuffy 感谢您的额外指点,我会亲自检查一下!

标签: bash shell


【解决方案1】:

你只需要颠倒参数。 [[ ... ]]、=、== 和 != 内部可以执行模式匹配,如果右侧操作数包含未转义的元字符,如 * 和 ?,或括号表达式 [...]。

if [[ $var == *"$param"* ]];   # check if $param is a substring of $var

您的代码可能执行了模式匹配,也可能没有执行模式匹配(取决于$var 的内容,但您看到的是嵌入在文字*s 中的$param 值的字符串是否与@987654332 的值匹配@。

例如,[[ foobar == *oba* ]] 会成功,因为oba 是foobar 的子字符串。 [[ *oba* == foobar ]] 不会,因为 *oba* 和 foobar 是两个截然不同的不同字符串。 [[ *oba* == *oba ]] 也会失败,因为 *oba* 不是以 oba 结尾的字符串。

【讨论】:

  • 注意,为了严格匹配,你应该把右边的变量放在双引号中(但不是通配符!),像这样:[[ $var == *"$param"* ]]。这会强制字符串中的任何通配符类型字符按字面意思匹配。
【解决方案2】:

试试这个

if [[ $var =~ $param ]]; then
    echo "matches"
fi

【讨论】:

  • 这是一个正则表达式,而不是一个 glob——一种非常不同的语法。
  • ...例如,如果param='.txt',[[ $var =~ $param ]] 将匹配atxt,即使a 不是.(因为. 是POSIX 中的单字符通配符ERE 正则表达式语法);而[[ $var = *"$param"* ]] 只会匹配精确的子字符串。
【解决方案3】:

我会使用 grep

if echo $var | grep -q $param; then
  echo "found it!"
fi

【讨论】:

  • 相当麻烦——如果你的param 包含空格,或者你的var 包含两个字符的字符串-n,试试这个。 (此外,启动管道意味着您至少要fork()ing 两次,然后使用execve() 用grep 的实例替换其中一个分叉子shell,以实现shell 本身可以做的事情内置)。
猜你喜欢
  • 1970-01-01
  • 2021-02-13
  • 2023-03-28
  • 1970-01-01
  • 2015-10-01
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多