如何检查Bourne Shell中的子字符串?

时间:2016-11-23 17:53:22

标签: sh

我想测试字符串是否包含" substring"。大多数在线答案都是基于Bash。我试过了

if [ $string == "*substring*" ] 

无效。目前

if echo ${string} | grep -q "substring" 

的工作。还有其他更好的方式。

4 个答案:

答案 0 :(得分:5)

在POSIX-features only shell中,如果没有的帮助,您将无法在条件中执行通用模式或正则表达匹配 >外部实用程序

那说:

您自己的grep方法肯定是一种选择,但您应该引用${string}

if echo "${string}" | grep -q "substring"; ...

更有效的方法是使用expr utility,但请注意,根据POSIX,它仅限于BREs基本正则表达式),这些都是有限的:< / p>

string='This text contains the word "substring".'

if expr "$string" : ".*substring" >/dev/null; then echo "matched"; fi

请注意,正则表达式 - 第3个操作数 - 隐含地锚定在输入的 start ,因此需要.*

>/dev/null抑制expr的默认输出,在这种情况下是匹配字符串的长度。 (如果没有匹配,则输出为0,退出代码设置为1。)

答案 1 :(得分:3)

使用POSIX兼容parameter-expansion和经典test-command

#!/bin/sh

substring=ab
string=abc

if [ "$string" != "${string%"$substring"*}" ]; then
    echo "$substring present in $string"
fi

(或)明确使用test运算符

if test "$string" != "${string%$substring*}" ; then

答案 2 :(得分:1)

如果您只是测试子字符串(或使用文件名通配符可以匹配的任何内容),您可以使用#!/bin/sh while read line; do case "$line" in *foo*) echo "$line" contains foo ;; *bar*) echo "$line" contains bar ;; *) echo "$line" isnt special ;; esac done $ ./testit.sh food food contains foo ironbar ironbar contains bar bazic bazic isnt special foobar foobar contains foo

MOD_DATE_TIME

这是基本的Bourne shell功能。它不需要任何外部程序,它不是特定于bash的,它早于POSIX。所以它应该是非常便携的。

答案 3 :(得分:0)

简短的回答是否定的,如果您尝试使用vanilla sh而不使用Bash扩展名,则不是。在许多现代系统中,/bin/sh实际上是/bin/bash的链接,它提供sh功能的超集(大部分)。您最初的尝试可以使用Bash的内置[[扩展测试命令:http://mywiki.wooledge.org/BashFAQ/031