我想测试字符串是否包含" substring"。大多数在线答案都是基于Bash。我试过了
if [ $string == "*substring*" ]
无效。目前
if echo ${string} | grep -q "substring"
的工作。还有其他更好的方式。
答案 0 :(得分:5)
在POSIX-features only shell中,如果没有的帮助,您将无法在条件中执行通用模式或正则表达匹配 >外部实用程序 。
那说:
Kenster's helpful answer显示了如何使用case ... esac
语句的分支进行模式匹配。
Inian's helpful answer展示了如何在条件中间接匹配间接 ,使用模式作为参数扩展的一部分 强>
您自己的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