在 Bash 中,python 语句的等价语句是什么:
if "mystr" in "a long string with mystring in it":
print("found string")
字符数的偏移量不能依赖于恒定,因此我认为我无法开始cut
工作。
答案1
使用通配符匹配。对于 bash 来说:
if [[ $longstring == *mystr* ]]; then
if [[ $longstring == *"my string"* ]]; then
if [[ $longstring == *"$matchstr"* ]]; then
在[[
运算符中,左侧按字面意思进行扩展(即不需要双引号),而右侧未加引号的部分则被视为通配符 - 基本上与语句中的引用规则相同case
。
也可以使用 POSIX 正则表达式匹配:
if [[ $longstring =~ mystr ]]; then
if [[ $longstring =~ "my string" ]]; then
if [[ $longstring =~ "$matchstr" ]]; then
再次,右侧的引号部分按字面意思匹配,而未引号的部分则作为正则表达式运算符匹配。
如果您需要什兼容性:
case $longstring in
*mystr*)
echo yes;;
*"$matchstr"*)
echo yes again!;;
*)
echo no;;
esac
或者,如果你想滥用语言:
if case $longstring in
*mystr*) true;;
*"$matchstr"*) true;;
*) false;;
esac; then
...
fi
(这种 if/case/esac/then 形式实际上在某些情况下很有用,例如在制作增量白名单/黑名单时。)
简短版本:
if ! case $longstring in *"$matchstr"*) !; esac; then
echo "It matched!"
fi
很多 sh 脚本使用expr
但它不是 shell 内置的,因此速度有点慢:
if expr match "$longstring" ".*mystr"; then
...
fi
在这种情况下(因为 expr 无法看出引用的差异),整个“match”参数被解释为锚定正则表达式(类似于 grep,但始终带有前缀^
)。因此,在将变量作为匹配传递时要小心。
答案2
这将做到这一点:
#! /bin/bash
X=`echo "a long string with mystring in it" | grep "mystr" | wc -l`
if [ $X -gt 0 ]
then
echo "found string";
fi
这里的想法是“echo”设置字符串,grep 在传递给它的字符串中查找子字符串,然后 wc -l 返回找到该字符串的行数 - 因此是 0 或 1。
答案3
您可以使用bash
参数扩展:
if [ "${TestString/$SearchString/}" == "$TestString" ]; then echo Found; fi
或者如果你想要一个与 Bourne 兼容的表达式:
if [ "${TestString#*$SearchString}" == "$TestString" ]; then echo Found; fi
$SearchString
可以是文字:它可以包含空格,无论是文字还是变量,变量可以包含}
,但在文字中必须将其转义为\}
。在第一种形式中,同样的考虑也适用于/
。