如何检查字符串是否在Bash中包含子字符串


2564

我在Bash中有一个字符串:

string="My string"

如何测试它是否包含另一个字符串?

if [ $string ?? 'foo' ]; then
  echo "It's there!"
fi

??我不知道的运算符在哪里?我是否使用echo和grep

if echo "$string" | grep 'foo'; then
  echo "It's there!"
fi

看起来有点笨拙。


4
嗨,如果空字符串为假,为什么您认为它笨拙?尽管提出了解决方案,但这是唯一对我有用的方法。
ericson.cepeda 2015年

1
您可以使用expr此命令
cli__

4
这是一个用于posix外壳的工具:stackoverflow.com/questions/2829613/…–
sehe

Answers:


3646

如果使用双括号,您也可以在案例语句之外使用Marcus的答案(*通配符)

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

请注意,针线中的空格必须放在双引号之间,而*通配符应位于外部。另请注意,仅使用了一个简单的比较运算符(即==),而不是regex运算符=~


126
还要注意,您可以通过在测试中切换到!=来反转比较。感谢您的回答!
奎因·泰勒

63
@Jonik:您可能想念shebang或将其设为#!/bin/sh。试试吧#!/bin/bash
暂停,直到另行通知。

10
在方括号和内容之间留一个空格。
保罗·普赖斯

17
您不需要在[[]]中引用变量。这将同样有效:[[$ string == $ needle ]] && echo
Orwellophile 2013年

12
@Orwellophile 小心!您只能在的第一个参数中省略双引号[[。参见ideone.com/ZSy1gZ
nyuszika7h 2014年

611

如果您更喜欢正则表达式方法:

string='My string';

if [[ $string =~ "My" ]]
then
   echo "It's there!"
fi

2
不得不在bash脚本中替换egrep regex,这很完美!
blast_hardcheese 2012年

114
=~运营商已搜索匹配整个字符串; 在.*的这里有多余的。同样,引号通常比反斜杠更可取:[[ $string =~ "My s" ]]
bukzor

16
自Bash 3.2+起,@ bukzor引号在此处停止工作:tiswww.case.edu/php/chet/bash/FAQE14)。最好分配给变量(使用引号),然后进行比较。像这样:re="My s"; if [[ $string =~ $re ]]
seanf

36
测试它是否包含字符串: if [[ ! "abc" =~ "d" ]]是。
KrisWebDev

1
请注意,测试发生的顺序很重要。下面的代码行的输出将是前进2number=2; if [[ "1, 2, 4, 5" = *${number}* ]]; then echo forward $number; fi; if [[ *${number}* = "1, 2, 4, 5" ]]; then echo backwards $number; fi;
的Douwe范德瓦Leest

356

我不确定要使用if语句,但是用case语句可以得到类似的效果:

case "$string" in 
  *foo*)
    # Do stuff
    ;;
esac

76
这可能是最好的解决方案,因为它可以随身携带posix shell。(aka no bashisms)
technosaurus

25
@technosaurus我发现在一个只有bash标签的问题中批评“ bashism”有点奇怪:)
PP

39
@PP与其说是批评,不如说是更普遍的解决方案而不是更有限的解决方案的偏爱。请考虑,几年后,像我这样的人会停下来寻找该答案,并且可能很高兴找到一个比原始问题更有用的答案。正如他们在开源世界中所说:“选择是好的!”
卡尔·斯莫特里奇

2
@ technosaurus,FWIW [[ $string == *foo* ]]还可以在某些符合POSIX的sh版本(例如,/usr/xpg4/bin/sh在Solaris 10上)和ksh(> = 88)中运行
maxschlepzig

3
Busybox灰无法处理星号[[...案例切换确实起作用了!
雷·福斯

232

stringContain 变体(兼容或不区分大小写)

正如这些Stack Overflow答案主要介绍了Bash一样,我在此帖子的最底部发布了一个不区分大小写的 Bash函数。

反正有我的

兼容答案

由于已经有很多使用Bash特定功能的答案,因此有一种方法可以在功能较差的shell下工作,例如BusyBox

[ -z "${string##*$reqsubstr*}" ]

实际上,这可以使:

string='echo "My string"'
for reqsubstr in 'o "M' 'alt' 'str';do
  if [ -z "${string##*$reqsubstr*}" ] ;then
      echo "String '$string' contain substring: '$reqsubstr'."
    else
      echo "String '$string' don't contain substring: '$reqsubstr'."
    fi
  done

这已经在Bash,DashKornShellksh)和ash(BusyBox)下进行了测试,结果始终是:

String 'echo "My string"' contain substring: 'o "M'.
String 'echo "My string"' don't contain substring: 'alt'.
String 'echo "My string"' contain substring: 'str'.

融入一项功能

正如@EeroAaltonen要求的,这是相同演示的版本,在相同的shell下进行了测试:

myfunc() {
    reqsubstr="$1"
    shift
    string="$@"
    if [ -z "${string##*$reqsubstr*}" ] ;then
        echo "String '$string' contain substring: '$reqsubstr'.";
      else
        echo "String '$string' don't contain substring: '$reqsubstr'."
    fi
}

然后:

$ myfunc 'o "M' 'echo "My String"'
String 'echo "My String"' contain substring 'o "M'.

$ myfunc 'alt' 'echo "My String"'
String 'echo "My String"' don't contain substring 'alt'.

注意:您必须转义或双引号和/或双引号:

$ myfunc 'o "M' echo "My String"
String 'echo My String' don't contain substring: 'o "M'.

$ myfunc 'o "M' echo \"My String\"
String 'echo "My String"' contain substring: 'o "M'.

功能简单

这是在BusyBox,Dash和Bash下测试的:

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

那么现在:

$ if stringContain 'o "M3' 'echo "My String"';then echo yes;else echo no;fi
no
$ if stringContain 'o "M' 'echo "My String"';then echo yes;else echo no;fi
yes

...或者,如@Sjlver指出的那样,如果提交的字符串可以为空,则该函数将变为:

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

或如AdrianGünter的评论所建议,避免-o切换:

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

最终(简单)功能:

并反转测试以使其更快地变得可能:

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

使用空字符串:

$ if stringContain '' ''; then echo yes; else echo no; fi
yes
$ if stringContain 'o "M' ''; then echo yes; else echo no; fi
no

不区分大小写(仅限Bash!)

对于不区分大小写的字符串测试,只需将每个字符串转换为小写即可:

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

校验:

stringContain 'o "M3' 'echo "my string"' && echo yes || echo no
no
stringContain 'o "My' 'echo "my string"' && echo yes || echo no
yes
if stringContain '' ''; then echo yes; else echo no; fi
yes
if stringContain 'o "M' ''; then echo yes; else echo no; fi
no

1
如果您能找到某种方法将其放入函数中,那就更好了。
Eero Aaltonen

2
@EeroAaltonen您如何找到我的(新添加的)功能?
F. Hauri 2014年

2
我知道!找 。名称“ *” | xargs grep“ myfunc” 2> / dev / null
eggmatters 2014年

6
这很棒,因为它是如此兼容。但是,有一个错误:如果干草堆字符串为空,则该错误不起作用。正确的版本将是string_contains() { [ -z "${2##*$1*}" ] && [ -n "$2" -o -z "$1" ]; } 最终思想:空字符串是否包含空字符串?上面的版本是(由于-o -z "$1"部分)。
Sjlver 2014年

3
+1。很好!对我来说,我更改了命令stringContain(){[-z“ $ {1 ## * $ 2 *}”] && [-z“ $ 2” -o -n“ $ 1”]; }; “搜索位置”“查找内容”。在busybox中工作。上面接受的答案不适用于busybox。
user3439968

148

您应该记住,shell脚本不是一种语言,而是更多的命令集合。本能地,您认为此“语言”要求您if使用a [或a 跟随a [[。这两个都是返回退出状态以指示成功或失败的命令(就像其他命令一样)。因此,我将使用grep,而不是[命令。

做就是了:

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

既然您正在考虑if测试它后面的命令的退出状态(用分号完成),为什么不重新考虑要测试的字符串的来源呢?

## Instead of this
filetype="$(file -b "$1")"
if grep -q "tar archive" <<<"$filetype"; then
#...

## Simply do this
if file -b "$1" | grep -q "tar archive"; then
#...

-q选项使grep不输出任何内容,因为我们只需要返回代码。<<<使shell扩展下一个单词并将其用作命令的输入<<(此处文档的单行版本)(我不确定这是标准版本还是Bashism版本)。


7
他们在这里被称为字符串(3.6.7)我相信这是bashism
alex.pilon

10
一个人也可以使用Process Substitution if grep -q foo <(echo somefoothing); then
larsr 2011年

请注意,这echo是不可移植的,如果要传递变量,请printf '%s' "$string改用。
nyuszika7h 2014年

5
这样做的代价是非常昂贵的:做一个grep -q foo <<<"$mystring"隐含1个叉,是Bashismecho $mystring | grep -q foo隐含2个叉(一个用于管道,另一个用于运行/path/to/grep
F. Hauri 2015年

1
echo如果参数字符串包含反斜杠序列,则不带标志的@BrunoBronosky 可能仍具有意外的可移植性问题。echo "nope\c"期望在某些平台上可以像echo -e "nope"在其他平台上一样工作。printf '%s' "nope"vsprintf '%s\n' 'nope\c'
Tripleee '18

92

公认的答案是最好的,但是由于有多种方法可以实现,因此这是另一种解决方案:

if [ "$string" != "${string/foo/}" ]; then
    echo "It's there!"
fi

${var/search/replace}$var与第一个实例search所取代replace,如果它被找到(它不会改变$var)。如果您尝试不foo进行任何替换,并且字符串已更改,则显然foo已找到。


5
上面的临时解决方案:>`if [“ $ string”!=“ $ {string / foo /}”]; 然后回声“在那儿!” 当使用BusyBox的shell ash时,fi很有用。可接受的解决方案不适用于BusyBox,因为某些bash的正则表达式未实现。
TPoschel

1
差异的不平等。很奇怪的想法!我喜欢它
nitinr708

1
除非你的字符串是“富”,虽然
venimus

我自己编写了相同的解决方案(因为我的口译员不会接受最重要的答案),然后又去寻找更好的解决方案,但是找到了!
BuvinJ

56

因此,对于这个问题有很多有用的解决方案-但是哪一个最快/使用最少的资源?

使用此框架重复测试:

/usr/bin/time bash -c 'a=two;b=onetwothree; x=100000; while [ $x -gt 0 ]; do TEST ; x=$(($x-1)); done'

每次更换测试:

[[ $b =~ $a ]]           2.92 user 0.06 system 0:02.99 elapsed 99% CPU

[ "${b/$a//}" = "$b" ]   3.16 user 0.07 system 0:03.25 elapsed 99% CPU

[[ $b == *$a* ]]         1.85 user 0.04 system 0:01.90 elapsed 99% CPU

case $b in *$a):;;esac   1.80 user 0.02 system 0:01.83 elapsed 99% CPU

doContain $a $b          4.27 user 0.11 system 0:04.41 elapsed 99%CPU

(doContain在F. Houri的回答中)

对于傻笑:

echo $b|grep -q $a       12.68 user 30.86 system 3:42.40 elapsed 19% CPU !ouch!

因此,无论是在扩展测试中还是在案例中,简单的替换选项都可以预期获胜。手提箱是便携式的。

预测达到100000次抖动很痛苦!关于无需使用外部实用程序的旧规则仍然适用。


4
整洁的基准。说服我使用[[ $b == *$a* ]]
疯狂物理学家2016年

2
如果我没看错的话,case则以最小的总时间消耗来赢得比赛。但是,您缺少星号$b in *$a。与得到更正的错误[[ $b == *$a* ]]相比,我得到的结果要快一些case,但是,当然,这也可能取决于其他因素。
Tripleee '18

1
ideone.com/5roEVt针对我的实验修复了一些其他错误,并针对其他情况(在较长的字符串中实际上不存在该字符串)进行了测试。结果在很大程度上相似;[[ $b == *$a* ]]速度很快,case几乎一样快(并且与POSIX兼容)。
Tripleee '18

28

这也适用:

if printf -- '%s' "$haystack" | egrep -q -- "$needle"
then
  printf "Found needle in haystack"
fi

负面测试是:

if ! printf -- '%s' "$haystack" | egrep -q -- "$needle"
then
  echo "Did not find needle in haystack"
fi

我认为这种样式更经典-较少依赖Bash shell的功能。

--参数是纯POSIX偏执狂,用于防止类似于选项(例如--abc或)的输入字符串-a

注意:在一个紧凑的循环这个代码将是多少比使用内部击壳特征慢,作为一个(或两个)独立的过程将被创建并经由配管连接。


5
...但是OP没有说出bash的版本;例如,较旧的bash(例如solaris经常使用的)可能不包括这些较新的bash功能。(我在带bash 2.0的solaris上遇到了这个确切的问题(未实现bash模式匹配))
michael

2
echo是不可移植的,您应该printf '%s' "$haystack改用它。
nyuszika7h 2014年

2
echo不会,请完全避免除文字文本外使用没有以-。开头的转义符。它可能对您有用,但它不是便携式的。甚至bash的echo行为也取决于是否xpg_echo设置了该选项。PS:我忘记在上一条评论中双引号。
nyuszika7h 2014年

1
我不确定@kevinarpe,--它未在的POSIX规范中printf列出,但printf '%s' "$anything"无论如何都应使用,以避免在$anything包含%字符的情况下出现问题。
nyuszika7h 2015年

1
@kevinarpe基于此,可能是。
nyuszika7h

21

Bash 4+示例。注意:如果单词包含空格等,不使用引号会引起问题。请始终在IMO的Bash中引用。

以下是一些Bash 4+的示例:

示例1,检查字符串中的“是”(不区分大小写):

    if [[ "${str,,}" == *"yes"* ]] ;then

示例2,检查字符串中的“是”(不区分大小写):

    if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then

示例3,检查字符串中的“是”(区分大小写):

     if [[ "${str}" == *"yes"* ]] ;then

示例4,检查字符串中的“是”(区分大小写):

     if [[ "${str}" =~ "yes" ]] ;then

示例5,完全匹配(区分大小写):

     if [[ "${str}" == "yes" ]] ;then

示例6,完全匹配(不区分大小写):

     if [[ "${str,,}" == "yes" ]] ;then

示例7,完全匹配:

     if [ "$a" = "$b" ] ;then

示例8,通配符匹配.ext(不区分大小写):

     if echo "$a" | egrep -iq "\.(mp[3-4]|txt|css|jpg|png)" ; then

请享用。


17

这个怎么样:

text="   <tag>bmnmn</tag>  "
if [[ "$text" =~ "<tag>" ]]; then
   echo "matched"
else
   echo "not matched"
fi

2
=〜用于正则表达式匹配,因此对于OP而言过于强大。

16

正如保罗在性能比较中所提到的

if echo "abcdefg" | grep -q "bcdef"; then
    echo "String contains is true."
else
    echo "String contains is not true."
fi

这与POSIX兼容,就像Marcus提供的答案中的'case“ $ string” in'一样,但是比case语句答案更易于阅读。还要注意,这比使用case语句要慢得多。正如Paul所指出的,不要循环使用它。



9
[[ $string == *foo* ]] && echo "It's there" || echo "Couldn't find"

我将添加echo "Couldn't find语句的末尾是一个不错的技巧,可以为这些匹配的命令返回0退出状态。
nicodjimenez

@nicodjimenez,使用此解决方案无法再定位退出状态。状态消息淹没了退出状态……
Jahid

1
这就是我的意思。如果没有,|| echo "Couldn't find"那么如果没有匹配项,您将返回错误退出状态,如果您正在运行CI管道(例如希望所有命令都返回),则可能不希望这样做非错误退出状态
nicodjimenez

9

一种是:

[ $(expr $mystring : ".*${search}.*") -ne 0 ] && echo 'yes' ||  echo 'no'

2
expr是其中一种瑞士军刀实用程序,通常可以做您需要做的任何事情,一旦您知道如何做,但是一旦实现,就永远不记得它为什么或如何做它的工作,所以您永远不要再碰它,并希望它永远不会停止正在做的事情。
迈克尔,

@AloisMahdal我从未投票过,我只是在假设为什么要投票。警告性评论。expr当可移植性阻止使用bash(例如,旧版本之间的行为不一致),tr(到处都不一致)或sed(有时太慢)时,我确实会使用。但是从个人经验来看,每当重新阅读这些知识时expr,我都必须回到手册页。因此,我只想评论一下使用的每一种用法expr……
michael

1
曾经有一段时间,您拥有的只是原始的Bourne外壳。它缺少一些通常需要的功能,因此执行了诸如expr和这样的工具test来执行这些功能。在当今时代,通常会有更好的工具,其中许多工具内置于任何现代外壳中。我猜test仍然在那里,但是似乎没有人失踪expr
Tripleee '16

6

我喜欢sed。

substr="foo"
nonsub="$(echo "$string" | sed "s/$substr//")"
hassub=0 ; [ "$string" != "$nonsub" ] && hassub=1

编辑,逻辑:

  • 使用sed从字符串中删除子字符串实例

  • 如果新字符串与旧字符串不同,则存在子字符串


2
请添加一些说明。传授的基本逻辑不仅仅是让代码更重要,因为它有助于OP和其他读者解决这一问题以及类似的问题本身
Zulan

5

grep -q 为此有用。

使用相同awk

string="unix-bash 2389"
character="@"
printf '%s' "$string" | awk -vc="$character" '{ if (gsub(c, "")) { print "Found" } else { print "Not Found" } }'

输出:

未找到

string="unix-bash 2389"
character="-"
printf '%s' "$string" | awk -vc="$character" '{ if (gsub(c, "")) { print "Found" } else { print "Not Found" } }'

输出:

找到了

原始来源:http : //unstableme.blogspot.com/2008/06/bash-search-letter-in-string-awk.html


3
echo是不可移植的,您应该printf '%s' "$string"改用它。我正在编辑答案,因为该用户似乎不再存在。
nyuszika7h 2014年

echo@ nyuszika7h用什么方式不便于携带?
starbeamrainbowlabs

5

我发现经常需要此功能,因此我以这种方式使用自制的shell函数,.bashrc该函数使我可以按需要多次重复使用它,并使用易于记忆的名称:

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

要测试$string1(比如123abcABC)中是否包含(比如abc$string2,我只需要运行并检查返回值,例如stringinstring "$string1" "$string2"

stringinstring "$str1" "$str2"  &&  echo YES  ||  echo NO

[[“ $ str” == $ substr ]] && echo是|| echo NO
elyase 2012年

我敢肯定,x只有非常老的shell 才需要使用hack 。
nyuszika7h 2014年

5

我的.bash_profile文件以及我如何使用grep:

如果PATH环境变量包含我的两个bin目录,请不要附加它们,

# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

U=~/.local.bin:~/bin

if ! echo "$PATH" | grep -q "home"; then
    export PATH=$PATH:${U}
fi

1
这是答案吗?
codeforester

投票。为什么在grep(功能更强大)比以前更有可能了解Bash的工作方式时。还可以通过与一系列模式匹配来进一步扩展它:grep -q -E 'pattern1|...|patternN'
Mohamed Bana'2

4

这里回答的问题的扩展您如何判断一个字符串在POSIX sh中是否包含另一个字符串?

此解决方案适用于特殊字符:

# contains(string, substring)
#
# Returns 0 if the specified string contains the specified substring,
# otherwise returns 1.
contains() {
    string="$1"
    substring="$2"

    if echo "$string" | $(type -p ggrep grep | head -1) -F -- "$substring" >/dev/null; then
        return 0    # $substring is in $string
    else
        return 1    # $substring is not in $string
    fi
}

contains "abcd" "e" || echo "abcd does not contain e"
contains "abcd" "ab" && echo "abcd contains ab"
contains "abcd" "bc" && echo "abcd contains bc"
contains "abcd" "cd" && echo "abcd contains cd"
contains "abcd" "abcd" && echo "abcd contains abcd"
contains "" "" && echo "empty string contains empty string"
contains "a" "" && echo "a contains empty string"
contains "" "a" || echo "empty string does not contain a"
contains "abcd efgh" "cd ef" && echo "abcd efgh contains cd ef"
contains "abcd efgh" " " && echo "abcd efgh contains a space"

contains "abcd [efg] hij" "[efg]" && echo "abcd [efg] hij contains [efg]"
contains "abcd [efg] hij" "[effg]" || echo "abcd [efg] hij does not contain [effg]"

contains "abcd *efg* hij" "*efg*" && echo "abcd *efg* hij contains *efg*"
contains "abcd *efg* hij" "d *efg* h" && echo "abcd *efg* hij contains d *efg* h"
contains "abcd *efg* hij" "*effg*" || echo "abcd *efg* hij does not contain *effg*"

该测试contains "-n" "n"在这里不起作用,因为echo -n可以将其吞下-n!一个流行的解决方案是改为使用printf "%s\n" "$string"
joeytwiddle

完美,已解决的字符串包含空格
dengApro

4

由于POSIX / BusyBox问题已关闭,而没有提供正确的答案(IMHO),因此我将在此处发布答案。

可能的最短答案是:

[ ${_string_##*$_substring_*} ] || echo Substring found!

要么

[ "${_string_##*$_substring_*}" ] || echo 'Substring found!'

请注意,双散列对于某些shell()是必需的ash。上面将评估[ stringvalue ]何时找不到子字符串。它没有返回错误。找到子字符串后,结果为空并求值[ ]。由于该字符串已完全替换,因此将抛出错误代码1(由于*),。

最常用的最短语法:

[ -z "${_string_##*$_substring_*}" ] && echo 'Substring found!'

要么

[ -n "${_string_##*$_substring_*}" ] || echo 'Substring found!'

另一个:

[ "${_string_##$_substring_}" != "$_string_" ] && echo 'Substring found!'

要么

[ "${_string_##$_substring_}" = "$_string_" ] || echo 'Substring found!'

注意单个等号!



3

尝试oobash。

它是Bash 4的OO风格的字符串库。它支持德语变音符号。它是用Bash编写的。

许多功能:-base64Decode-base64Encode-capitalize-center-charAt-concat-contains-count-endsWith-equals-equalsIgnoreCase-reverse-hashCode-indexOf-isAlnum-isAlpha-isAscii-isDigit-isEmpty-isHexDigit-isLowerCase-isSpace-isPrintable-isUpperCase-isVisible-lastIndexOf-length-matches-replaceAll-replaceFirst-startsWith-substring-swapCase-toLowerCase-toString-toUpperCase-trim,和-zfill

看一下包含的例子:

[Desktop]$ String a testXccc
[Desktop]$ a.contains tX
true
[Desktop]$ a.contains XtX
false

oobash可在Sourceforge.net上获得


2

我使用此函数(不包括但很明显的一个依赖项)。它通过了如下所示的测试。如果函数返回的值> 0,则找到字符串。您可以轻松地返回1或0。

function str_instr {
   # Return position of ```str``` within ```string```.
   # >>> str_instr "str" "string"
   # str: String to search for.
   # string: String to search.
   typeset str string x
   # Behavior here is not the same in bash vs ksh unless we escape special characters.
   str="$(str_escape_special_characters "${1}")"
   string="${2}"
   x="${string%%$str*}"
   if [[ "${x}" != "${string}" ]]; then
      echo "${#x} + 1" | bc -l
   else
      echo 0
   fi
}

function test_str_instr {
   str_instr "(" "'foo@host (dev,web)'" | assert_eq 11
   str_instr ")" "'foo@host (dev,web)'" | assert_eq 19
   str_instr "[" "'foo@host [dev,web]'" | assert_eq 11
   str_instr "]" "'foo@host [dev,web]'" | assert_eq 19
   str_instr "a" "abc" | assert_eq 1
   str_instr "z" "abc" | assert_eq 0
   str_instr "Eggs" "Green Eggs And Ham" | assert_eq 7
   str_instr "a" "" | assert_eq 0
   str_instr "" "" | assert_eq 0
   str_instr " " "Green Eggs" | assert_eq 6
   str_instr " " " Green "  | assert_eq 1
}

悬念!什么依赖?
Peter Mortensen

“ str_escape_special_characters”功能。它在GitHub arcshell_str.sh文件中。arcshell.io将带您到达那里。
伊桑·波斯特


0
msg="message"

function check {
    echo $msg | egrep [abc] 1> /dev/null

    if [ $? -ne 1 ];
    then 
        echo "found" 
    else 
        echo "not found" 
    fi
}

check

这将发现a或b或c的任何出现


0

通用针型干草堆示例带有变量

#!/bin/bash

needle="a_needle"
haystack="a_needle another_needle a_third_needle"
if [[ $haystack == *"$needle"* ]]; then
    echo "needle found"
else
    echo "needle NOT found"
fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.