我想看看里面是否有字符串一部分另一个字符串。
例如:
'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 1
和exit 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