在Bash中如何检查字符串是否包含子字符串

问:

在 Bash 中一个字符串如下:

bash 复制代码
string="My string"

如何测试它是否包含另一个字符串?

bash 复制代码
if [ $string ?? 'foo' ]; then
  echo "It's there!"
fi

其中 ?? 是我不知道的运算符。我该使用 echo 和 grep 吗?

bash 复制代码
if echo "$string" | grep 'foo'; then
  echo "It's there!"
fi

这看起来有点笨拙。


答1:

我不确定是否可以使用 if 语句,但你可以使用 case 语句得到类似的效果:

bash 复制代码
case "$string" in 
  *foo*)
    # Do stuff
    ;;
esac

答2:

如果使用双方括号,也可以在 case 语句之外使用 Marcus 的答案(* 通配符):

bash 复制代码
string='My long string'
if [[ $string == *"My long"* ]]; then
  echo "It's there!"
fi

请注意,中间有空格的字符串需要放在双引号之间,* 通配符应该在外面。还要注意,这里使用了一个简单的比较操作符(即 ==),而不是正则表达式操作符 =~。


答3:

如果你更喜欢正则表达式的方法:

bash 复制代码
string='My string';

if [[ $string =~ "My" ]]; then
   echo "It's there!"
fi

更多解决思路的回答参考:https://stackoverflow.com/a/20460402

简单的函数:

bash 复制代码
stringContain() { [ -z "$1" ] || { [ -z "${2##*$1*}" ] && [ -n "$2" ];};}

这样可以测试空字符串的情况:

bash 复制代码
$ if stringContain '' ''; then echo yes; else echo no; fi
yes
$ if stringContain 'o "M' ''; then echo yes; else echo no; fi
no

参考:stackoverflow question 229551


相关阅读:

相关推荐
小苏兮5 小时前
【把Linux“聊”明白】自动化构建-make/Makefile详解
linux·服务器·学习·自动化·1024程序员节
kyle~5 小时前
计算机网络---安全外壳协议(SSH,Secure Shell)
运维·计算机网络·安全·ssh
fy zs5 小时前
linux文件系统和软硬连接
linux·centos
破烂pan5 小时前
Jenkins 定时触发(cron)使用说明
运维·jenkins
QT 小鲜肉5 小时前
【个人成长笔记】将Try Ubuntu里面配置好的文件系统克隆在U盘上(创建一个带有持久化功能的Ubuntu Live USB系统)
linux·开发语言·数据库·笔记·ubuntu
拾心216 小时前
【云运维】ELK笔记
运维·elk
AC是你的谎言7 小时前
网络层和数据链路层
linux·网络·学习·智能路由器
AWS官方合作商7 小时前
深入解析:利用EBS直接API实现增量快照与精细化数据管理(AWS)
运维·云计算·aws
waves浪游7 小时前
基础开发工具(下)
linux·运维·服务器·开发语言·c++
Miki Makimura7 小时前
KVStore 多行文章型键值扩展解析:切片存储与客户端多行交互
运维·服务器·网络·学习