Bash Array Contém falsos positivos

0

Isso é um som bastante simplista, mas estou batendo a cabeça na parede tentando descobrir o que está acontecendo. Eu estou tentando ver se existe um valor em uma matriz bash. Se sim, faça alguma coisa. Mais, faça outra coisa.

Eu não consigo entender por que isso está sempre falhando para mim.

Basicamente comece com dois valores separados, concatene-os com um delimitador, pesquise em uma matriz e se toda a cadeia (delimitador e tudo) estiver em qualquer um dos elementos da matriz faça algo, senão faça outra coisa.

#!/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}"

Resultados:

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

Eu também tentei if [[ "${NAME}" == *"${SEARCHNAME[@]}"* ]] mas nenhuma diferença ... Eu estou perdendo algo bastante óbvio aqui e estou pensando que pode ser com a maneira que eu estou declarando minha matriz? Eu esperaria que a falta de espaço entre cada elemento da matriz (visto na saída da matriz) não fizesse diferença por causa dos caracteres curingas?

    
por Chris 30.06.2017 / 18:30

2 respostas

2

Corrija as atribuições da matriz e altere o teste para um regex.

#!/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}"
    
por 30.06.2017 / 19:31
1

Há algumas coisas a serem observadas aqui:

  1. Usando o == no lugar de =~ , pois não estamos procurando igualdade aqui.
  2. Como esse é um regex não wildcard so ...
  3. A ordem dos operandos no [[precisa ser invertida, como, por exemplo:

    if [[ ${SEARCHNAME[@]} =~ .*$NAME.* ]]
    
por 30.06.2017 / 19:31

Tags