Arrays 一个字符串包含bash中的子字符串-不工作

Arrays 一个字符串包含bash中的子字符串-不工作,arrays,bash,shell,Arrays,Bash,Shell,我有以下代码: #!/bin/bash temp=("aaa", "bbb", "ccc", "ddd", "eee") sub="cc" for i in $temp do if [[ $i == *"$sub"* ]]; then echo "contains sub" fi done 为什么子字符串在循

我有以下代码:

#!/bin/bash

temp=("aaa", "bbb", "ccc", "ddd", "eee")
sub="cc"

for i in $temp
    do if [[ $i == *"$sub"* ]]; then
    echo "contains sub"
    fi
done
为什么子字符串在循环期间不包含在temp中?(if语句永远不会为true,并且永远不会到达回显)


我可以想象,这段代码一个接一个地遍历temp(例如“aaa”、“bbb”、“ccc”等),并将它们与sub“cc”进行比较,以查看sub是否包含在temp中的任何字符串中,但显然我没有得到任何东西。

您有几个问题

  • 从阵列初始化中删除
    ,'
  • 将“${temp[@]}”中的i的循环更改为
  • 由于这是bash,最好使用
    do if[[$i=~“$sub”];然后
  • (注意:
    $sub
    无引号将被视为正则表达式)

    总而言之:

    #/bin/bash
    温度=(“aaa”“bbb”“ccc”“ddd”“eee”)
    sub=“cc”
    对于“${temp[@]}”中的i
    如果[[$i=~“$sub”]],则执行此操作;然后
    回显“$i-包含子项”
    fi
    完成
    
    示例输出

    $ bash s.sh
    ccc - contains sub
    

    temp=(“aaa”“bbb”“ccc”“ddd”“eee”)
    (注意没有
    ,“
    )。。。并使用“${temp[@]}”中的i的
    访问其元素。请将脚本粘贴到。请注意
    [[[$i=~$sub]]
    $sub的值视为正则表达式模式;这仅在它包含任何正则表达式元字符时才重要,但如果它包含任何正则表达式元字符,则可能会导致意外结果。如果你想把它当作一个普通字符串来处理,就把它双引号引起来(即使用
    [[$i==*“$sub”*]
    [$i=~“$sub”]]
    )以避免对元字符的解释。@GordonDavisson--这是一个很好的观点。
    =“$sub”
    为什么比
    ==*“$sub”*
    更好?@JohnKugelman没有技术原因,两者都会匹配,但是
    =~
    提供了使用正则表达式而不是简单全局匹配的灵活性。
    [[$i=*“$sub”*]
    没有什么问题,选择
    =~
    比其他任何东西都更不符合
    […]
    的习惯。
    =~
    看起来更好,而且更短