Linux 中的 $STRING1 != "${STRING1/substr/}"

Linux 中的 $STRING1 != "${STRING1/substr/}"

我有一个字符串,我想检查它是否包含子字符串。所以我正在使用这个命令。下面是 Linux shell 脚本。我只是想知道 if 语句中的条件是如何工作的?

STRING1='This string contains substring.'
if [[ $STRING1 != "${STRING1/substr/}" ]]; then
  echo "Substring is present"
fi

答案1

这是一种复杂且 ksh 特定的(尽管现在受到其他一些 shell 支持)编写标准的方式:

case $STRING1 in
   *substr*) echo Substring is present
esac

或特定于 ksh 的:

if [[ $STRING1 = *substr* ]]; then
  echo Substring is present
fi

${var/pattern/replacement}$var是一个 ksh 参数扩展运算符,它扩展为第一次出现的pattern已替换为的值replacement

第一次出现的情况${STRING1/substr/}也是如此,没有任何内容替换,因此被删除。$STRING1substr

[[ string = pattern ]][[ string != pattern ]]是另一个 ksh 特定构造,用于将字符串与模式进行匹配。当模式被引用时,它是按字面意思理解的,[[ string = "string" ]]相等运算符也是如此(以及不等式!=)。

因此,如果和[[ $STRING1 != "${STRING1/substr/}" ]]的扩展产生不同的字符串,则该命令将返回 true,而这种情况只有在inside至少出现一次时才会发生,因此这是一种检查contains的方法。$STRING1${STRING!/substr/}substr$STRING1$STRING1substr

虽然 和 都不[[...]]${var/pattern/replacement}标准sh语法,但[命令和${var#pattern}运算符(后一个也来自 ksh)是标准的。所以有时你会看到这样的代码:

if [ "$STRING1" != "${STRING1#*substr*}" ]; then
  echo Substring is present
fi

这是检查变量是否包含子字符串的标准(尽管不是 Bourne)方法,但又很复杂,并且比明显的case语句方法没有优势。

答案2

检查它是否包含子字符串

看起来执行起来更简单

[ -z "${s##*substr*}" ] && echo Substring is present

如果存在,则展开的结果${…}为 null(零长度) 。substr


... if 语句中的条件如何工作?这

if [[ $STRING1 != "${STRING1/substr/}" ]]; then

正在比较两个字符串,原始未修改的字符串和substr删除 ( /substr/}) 的相同字符串。如果不同 ( !=),则原始字符串包含substr

相关内容