Bash 子字符串测试检测空字符串作为非空字符串的子字符串

时间:2021-04-27 15:39:38

标签: bash

考虑一下...

#!/bin/bash
declare STR='test'
declare SUB=''
[[ "${STR}" == *"${SUB}"* ]] && echo 'match'

这似乎解决或评估为真?这对我来说毫无意义。

要获得预期的结果,您必须测试 SUB 字符串是否为空?

#!/bin/bash
declare STR='test'
declare SUB=''
[[ ! -z "${SUB}" ]] && [[ "${STR}" == *"${SUB}"* ]] && echo 'match'

这是 BASH 之类的怪癖吗?如果子字符串不在字符串中,它不应该返回false吗?

2 个答案:

答案 0 :(得分:1)

空字符串是每个字符串的一部分。因此,测试一个空字符串是否是其他任何字符串的子字符串总是正确的。


这不是 bash 特有的,也不是任何不寻常的;你可以用其他语言查看。

  • Python:print('' in 'foo') 打印 True
  • Java:String("foo").contains("") 返回 true。
  • C: strstr("foo", "") 返回指向 foo 中第一个字符的指针,表示它找到了匹配项。
  • Ruby:"foo".include? "" 返回 true。

答案 1 :(得分:0)

是的,您应该明确检查可能的空字符串,但我会使用 .grid-container * { border: 1px solid red; position: relative; } .grid-container *:after { content:attr(class); position: absolute; top: 0; left: 0; 而不是 not,并且在 -n 中,您可以将其设为单个复合条件检查。

bash

...而且您不需要前导和尾随 glob,它们实际上并没有添加任何内容。