# .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
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
#...
$ 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'.
Notice: 您必须转义或双重引号和/或双引号:
$ 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'.
$ 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
21 回答
这个怎么样:
如果您更喜欢正则表达式方法:
所以这个问题有很多有用的解决方案 - 但哪个最快/使用最少的资源?
使用此框架重复测试:
每次更换TEST:
(doContain在F. Houri的回答中)
而对于咯咯地笑:
因此,无论是在扩展测试还是案例中,简单替代选项都可以获得胜利 . 外壳是便携式的 .
管道输出到100000 greps是可以预料的痛苦!关于无需使用外部实用程序的旧规则是正确的 .
我的.bash_profile以及我如何使用grep如果PATH包含我的2个bin目录,请不要附加它们
一个是:
我经常发现需要这个功能,所以我在我的_79945中使用了一个自制的shell函数,这样我就可以根据需要重复使用它,并且有一个易记的名字:
要测试
$string1
(例如,abc)是否包含在$string2
(例如,123abcABC)中,我只需要运行stringinstring "$string1" "$string2"
并检查返回值,例如接受的答案是最好的,但由于有多种方法可以做到这一点,这是另一种解决方案:
${var/search/replace}
是$var
,search
的第一个实例被replace
替换,如果找到它(它不会改变$var
) . 如果您尝试将foo
替换为空,并且字符串已更改,则显然找到了foo
.您应该记住,shell脚本不是一种语言,而是一组命令 . 你本能地认为这个"language"要求你跟
if
跟[
或[[
. 这两个只是返回退出状态的命令,指示成功或失败(就像所有其他命令一样) . 出于这个原因,我使用grep
,而不是[
命令 .做就是了:
现在您正在考虑
if
测试其后面的命令的退出状态(以分号结尾) . 为什么不重新考虑你正在测试的字符串的来源?-q
选项使grep不输出任何内容,因为我们只需要返回代码 .<<<
使shell扩展下一个单词并将其用作命令的输入,这是<<
here文档的单行版本(我不确定这是标准还是基础) .保罗在他的表现比较中提到:
这与POSIX兼容,就像Marcus提供的'case'$ string“in'答案一样,但比case语句答案稍微容易阅读 . 另请注意,这将比使用case语句慢得多,正如Paul所指出的,不要在循环中使用它 .
This Stack Overflow answer是唯一一个捕获空间和破折号的人:
我使用这个函数(一个依赖项不包括但很明显) . 它通过了下面显示的测试 . 如果函数返回值> 0,则找到该字符串 . 您可以轻松返回1或0 .
我不确定使用if语句,但是你可以使用case语句获得类似的效果:
兼容的答案
由于已经有很多使用Bash特定功能的答案,因此有一种方法可以在功能较差的shell下工作,例如busybox:
在实践中,这可能会给:
这是在bash,dash,ksh和ash(busybox)下测试的,结果总是如下:
成一个功能
正如@EeroAaltonen所说,这是一个相同的演示版本,在相同的shell下测试:
然后:
Notice: 您必须转义或双重引号和/或双引号:
简单的功能
这是在busybox,dash下测试的,当然bash:
这就是所有人!
那么现在:
...或者,如果提交的字符串可能为空,如@Sjlver指出的那样,该函数将变为:
或者Adrian Günter's comment建议,避免
-o
开关:使用空字符串:
Bash4的例子 . 注意:当单词包含空格等时,不使用引号会导致问题 . 总是引用bash IMO .
以下是BASH4的一些示例:
例1,检查字符串中的“是”(不区分大小写):
例2,检查字符串中的“是”(不区分大小写):
例3,检查字符串中的“是”(区分大小写):
例4,检查字符串中的“是”(区分大小写):
例5,完全匹配(区分大小写):
例6,完全匹配(不区分大小写):
例7,完全匹配:
例8,通配符匹配.ext(不区分大小写):
请享用 .
你可以在外面使用Marcus's answer (* wildcards)一个case语句,如果你使用双括号:
请注意,针头字符串中的空格需要放在双引号之间,
*
通配符应该在外面 .确切的单词匹配:
grep -q
对此有用 .同样使用
awk
:输出:
输出:
原始来源:http://unstableme.blogspot.com/2008/06/bash-search-letter-in-string-awk.html
我喜欢sed .
编辑,逻辑:
使用sed从字符串中删除子字符串的实例
如果新字符串与旧字符串不同,则存在子字符串
尝试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
.查看包含示例:
oobash is available at Sourceforge.net .
这也有效:
负面测试是:
我认为这种风格更经典 - 更少依赖于Bash shell的功能 .
--
参数是纯POSIX偏执狂,用于保护输入字符串类似于选项,例如--abc
或-a
.注意:在紧密循环中,此代码将比使用内部Bash shell功能慢得多,因为将创建一个(或两个)单独的进程并通过管道连接 .