在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


相关阅读:

相关推荐
文青小兵3 分钟前
Linux云计算——docker compose haibor elfk (四)
linux·服务器·docker·云计算
思麟呀8 分钟前
C++11并发编程:互斥锁
linux·开发语言·c++·windows
顺风尿一寸11 分钟前
深度解析 Linux touch 命令:从用户输入到磁盘 Inode 的完整旅程
linux
老毛肚19 分钟前
Docker Desktop 介绍
运维·docker·容器
j_xxx404_20 分钟前
Linux 线程日志系统设计:从策略模式、RAII 到 pthread 线程安全与内核写入路径|附源码
linux·运维·服务器·开发语言·c++·人工智能·策略模式
明天…ling23 分钟前
CentOS 7 安装 Docker 踩坑全记录(含 sudo 权限、yum 源失效、命令报错解决方案)
linux·docker·centos
江华森23 分钟前
Linux 内核调优 + TCP/IP 协议栈深度解析 + 低延迟网络优化
linux·网络·tcp/ip
学Linux的语莫34 分钟前
deepagent知识
linux·运维·服务器
步十人37 分钟前
epoll——I/O多路复用技术
linux·数据库·redis
浮生若城1 小时前
Linux库制作与原理(1):静态库、动态库和ELF文件
linux·运维·服务器