在Bash中检查字符串是否包含子字符串的方法

在Bash中检查字符串是否包含子字符串的方法

技术背景

在Bash脚本编程中,经常需要检查一个字符串是否包含另一个子字符串。这在文件处理、数据筛选、条件判断等场景中非常有用。Bash提供了多种方法来实现这一功能,每种方法都有其特点和适用场景。

实现步骤

使用双括号和通配符

可以在双括号 [[ ]] 中使用通配符 * 来检查字符串是否包含子字符串。示例代码如下:

1
2
3
4
string='My long string'
if [[ $string == *"My long"* ]]; then
echo "It's there!"
fi

需要注意的是,子字符串中的空格需要用双引号括起来,通配符 * 应放在外面,并且使用简单的比较运算符 ==,而不是正则运算符 =~

使用正则表达式

使用 =~ 运算符可以使用正则表达式来检查字符串是否包含子字符串。示例代码如下:

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

使用 case 语句

case 语句也可以用来检查字符串是否包含子字符串,并且这种方法具有较高的效率。示例代码如下:

1
2
3
4
5
6
7
string='My long string'
substring='My long'
case $string in
*$substring* )
echo "It's there!"
;;
esac

可以将其封装成一个函数:

1
stringContain() { case $2 in *$1* ) return 0;; *) return 1;; esac ;}

使用示例:

1
2
3
4
5
6
7
string='My long string'
substring='My long'
if stringContain "$substring" "$string"; then
echo "Match"
else
echo "No match"
fi

使用 grep 命令

grep 命令可以用来在字符串中搜索子字符串。示例代码如下:

1
2
3
4
5
string='My long string'
substring='My long'
if grep -q "$substring" <<< "$string"; then
echo "It's there!"
fi

-q 选项使 grep 不输出任何内容,只返回退出状态码。

使用参数扩展

通过参数扩展可以检查字符串是否包含子字符串。示例代码如下:

1
stringContain() { [ -z "$1" ] || { [ -z "${2##*$1*}" ] && [ -n "$2" ];};}

核心代码

case 方法函数封装

1
2
3
4
5
6
7
8
9
10
11
12
13
stringContain() {
if [[ $1 == -i ]]; then
case ${3,,} in
*${2,,}*) return 0;;
*) return 1;;
esac
else
case $2 in
*$1*) return 0;;
*) return 1;;
esac
fi
}

grep 方法示例

1
2
3
if grep -q foo <<< "$string"; then
echo "It's there"
fi

参数扩展方法示例

1
stringContain() { [ -z "$1" ] || { [ -z "${2##*$1*}" ] && [ -n "$2" ];};}

最佳实践

  • 效率优先:在性能敏感的场景中,优先使用 case 语句,因为它的效率较高。
  • 代码可读性:如果追求代码的可读性,可以使用双括号和通配符的方法。
  • 正则匹配:当需要进行复杂的匹配时,使用正则表达式。

常见问题

  • 空格问题:在使用通配符时,子字符串中的空格需要用双引号括起来。
  • 性能问题:在循环中使用 grep 命令会创建多个进程,导致性能下降,应尽量避免。
  • 大小写问题:默认情况下,匹配是区分大小写的。如果需要不区分大小写的匹配,可以使用参数扩展将字符串转换为小写或大写。例如 ${var,,} 转换为小写, ${var^^} 转换为大写。

在Bash中检查字符串是否包含子字符串的方法
https://119291.xyz/posts/2025-05-09.how-to-check-string-contains-substring-in-bash/
作者
ww
发布于
2025年5月9日
许可协议