Bash 数组包含误报

Bash 数组包含误报

我正在尝试查看 bash 数组中是否存在某个值。如果是这样,那就做点什么吧。否则,做点别的事吧。

我不明白为什么这对我来说总是失败。

基本上从两个单独的值开始,用分隔符连接它们,搜索数组,如果整个字符串(分隔符和所有)位于任何数组元素中,则执行某些操作,否则执行其他操作。

#!/bin/bash

FNAME="JACK"
LNAME="BLACK"

SEARCHNAME=()
SEARCHNAME+="JACK-BLACK"
SEARCHNAME+="JOHN-JAMES"
SEARCHNAME+="CHRIS-TOPHER"
SEARCHNAME+="JEN-NAY"

NAME="${FNAME}-${LNAME}"

if [[ $NAME == *"${SEARCHNAME[@]}"* ]]; then
    echo "PASSED"
else
    echo "FAILED"
fi

echo "SEARCH IN: ${SEARCHNAME[@]}"
echo "FOR NAME: ${NAME}"

结果:

FAILED
SEARCH IN: JACK-BLACKJOHN-JAMESCHRIS-TOPHERJEN-NAY
FOR NAME: JACK-BLACK

我也尝试过,if [[ "${NAME}" == *"${SEARCHNAME[@]}"* ]]但没有什么区别...我在这里遗漏了一些非常明显的东西,并且我认为这可能与我声明数组的方式有关?我希望每个数组元素之间缺乏空间(在数组输出中看到)不会因为通配符而产生影响?

答案1

更正数组分配,并将测试更改为正则表达式。

#!/bin/bash

FNAME="JACK"
LNAME="BLACK"

SEARCHNAME=()
SEARCHNAME+=("JACK-BLACK")
SEARCHNAME+=("JOHN-JAMES")
SEARCHNAME+=("CHRIS-TOPHER")
SEARCHNAME+=("JEN-NAY")

NAME="${FNAME}-${LNAME}"

if [[ "${SEARCHNAME[@]}" =~ $NAME ]]; then
    echo "PASSED"
else
    echo "FAILED"
fi

echo "SEARCH IN: ${SEARCHNAME[@]}"
echo "FOR NAME: ${NAME}"

答案2

这里有几点需要注意:

  1. 使用==代替 ,=~因为我们在这里并不寻求平等。
  2. 由于这是一个regex不太wildcard...
  3. [[ 中操作数的顺序需要颠倒,即:

    if [[ ${SEARCHNAME[@]} =~ .*$NAME.* ]]
    

相关内容