在 bash 中如何确定一个字符串是否是另一个字符串的子字符串?

在 bash 中如何确定一个字符串是否是另一个字符串的子字符串?

我想看看里面是否有字符串一部分另一个字符串。
例如:

'ab' in 'abc' -> true
'ab' in 'bcd' -> false

我如何在 Bash 脚本的条件中执行此操作?

答案1

[[ "bcd" =~ "ab" ]]
[[ "abc" =~ "ab" ]]

括号用于测试,由于它是双括号,所以可以做一些额外的测试,例如=~

因此你可以使用类似以下形式:

var1="ab"
var2="bcd"
if [[ "$var2" =~ "$var1" ]]; then
    echo "pass"
else
    echo "fail"
fi

答案2

${VAR/subs}您可以使用包含VAR较大字符串并且 subs是您要查找的子字符串的形式:

my_string=abc
substring=ab
if [ "${my_string/"$substring"}" = "$my_string" ] ; then
  echo "${substring} is not in ${my_string}"
else
  echo "${substring} was found in ${my_string}"
fi

${VAR/subs}是有效的,因为等于$VAR但是删除了第一次出现的字符串subs,特别是如果$VAR不包含该单词subs它将不会被修改。


笔记:作为贾梅特已经评论过,语句$substring中的参数if需要额外用双引号引起来,即使表达式${..}已经在双引号内,也要避免子字符串中的任何元字符保留其“元字符”,即被咬住SC2295

证明:如果将该substring=ab行改为substring=[abcdefg]没有多余的双引号,则程序将打印[abcdefg] was found in abc

答案3

使用 bash文件名模式(又称“glob”模式)

substr=ab
[[ abc == *"$substr"* ]] && echo yes || echo no    # yes
[[ bcd == *"$substr"* ]] && echo yes || echo no    # no

答案4

shell case 语句

这是最便携的解决方案,甚至可以在旧的 Bourne shell 和 Korn shell 上运行

#!/bin/bash
case "abcd" in
    *$1*) echo "It's a substring" ;;
    *) echo "Not a substring" ;;
esac

示例运行:

$ ./case_substr.sh "ab"                                                                                           
It's a substring
$ ./case_substr.sh "whatever"                                                                                     
Not a substring

请注意,您不必专门使用,echo您可以使用exit 1exit 0来表示成功或失败。

我们也可以做的是创建一个函数(如果需要可以在大型脚本中使用),并具有特定的返回值(匹配时为 0,不匹配时为 1):

$ ./substring_function.sh                                  
ab is substring

$ cat substring_function.sh                                
#!/bin/sh

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

main(){
   if is_substring "ab" "abcdefg"
   then
       echo "ab is substring"
   fi
}

main $@

grep

$ grep -q 'ab' <<< "abcd" && echo "it's a substring" || echo "not a substring"                                    
it's a substring

这种特殊方法对于 中的 if-else 语句非常有用bash。而且大多数情况下都是可移植的

大王

$ awk '$0~/ab/{print "it is a substring"}' <<< "abcd"                                                             
it is a substring

Python

$ python -c 'import sys;sys.stdout.write("it is a substring") if "ab" in sys.stdin.read() else exit(1)' <<< "abcd"
it is a substring

红宝石

$ ruby -e ' puts "is substring" if  ARGV[1].include? ARGV[0]'  "ab" "abcdef"                                             
is substring

相关内容