我有一个字符串,我想检查它是否包含子字符串。所以我正在使用这个命令。下面是 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/}
也是如此,没有任何内容替换,因此被删除。$STRING1
substr
[[ string = pattern ]]
和[[ string != pattern ]]
是另一个 ksh 特定构造,用于将字符串与模式进行匹配。当模式被引用时,它是按字面意思理解的,[[ string = "string" ]]
相等运算符也是如此(以及不等式!=
)。
因此,如果和[[ $STRING1 != "${STRING1/substr/}" ]]
的扩展产生不同的字符串,则该命令将返回 true,而这种情况只有在inside至少出现一次时才会发生,因此这是一种检查contains的方法。$STRING1
${STRING!/substr/}
substr
$STRING1
$STRING1
substr
虽然 和 都不[[...]]
是${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
。