String KSH:搜索多个子字符串的字符串

String KSH:搜索多个子字符串的字符串,string,substring,ksh,String,Substring,Ksh,我有一种在单个字符串中搜索多个子字符串的简单方法: if [[ $string = *"string 1"* && $string = *"string 2"* && $string = *"string 3"* ]] (此处搜索字符串中的字符串1、字符串2和字符串3) 我如何简化这一点,使之只有一张支票 我试过: if [[ $string = *"string 1"*"string 2"*"string 3"* ]] 及 注意:此处指定的三个字符串始终按此

我有一种在单个字符串中搜索多个子字符串的简单方法:

if [[ $string = *"string 1"* && $string = *"string 2"* && $string = *"string 3"* ]]
(此处搜索
字符串中的
字符串1
字符串2
字符串3

我如何简化这一点,使之只有一张支票

我试过:

if [[ $string = *"string 1"*"string 2"*"string 3"* ]]


注意:此处指定的三个字符串始终按此顺序排列,因此我可以对其进行简化。

在ksh93中,可以使用
&
子模式分隔符

$ [[ abcdefg == @(*bcd*&*cde*&*efg*) ]]; echo $?
0
$ [[ abcdefg == @(*bcdz*&*cde*&*efg*) ]]; echo $?
1
不幸的是,只有ksh93具有此功能。在mksh、zsh和bash中,通过扩展匹配,否定子模式允许这种类似DeMorgan的等价性

$ [[ abcdefg == !(!(*bcd*)|!(*cde*)|!(*efg*)) ]]; echo $?
0
$ [[ abcdefg == !(!(*bcdz*)|!(*cde*)|!(*efg*)) ]]; echo $?
1

要仅测试一种模式,请参见

第二种解决方案有效,谢谢。使用我的语法(即在“if”语句中),解决方案是:
if[[[$string==!(!(*“string 1*))|!(*“string2*))|!(*“string3*))]]
@Wikis您可能正在使用非常旧的ksh,或者AT&T ksh以外的其他东西。幸运的是
!()
非常适合所有类似ksh的外壳,甚至ksh88。我强烈怀疑前者。。。!
$ [[ abcdefg == !(!(*bcd*)|!(*cde*)|!(*efg*)) ]]; echo $?
0
$ [[ abcdefg == !(!(*bcdz*)|!(*cde*)|!(*efg*)) ]]; echo $?
1