Bash Array Contiene falsi positivi


0

Sto cercando di vedere se esiste un valore in un array bash. Se è così, fai qualcosa. Altrimenti, fai qualcos'altro.

Non riesco a capire perché questo non vada sempre a buon fine.

Fondamentalmente inizia con due valori separati, concatenali con un delimitatore, cerca in un array e se l'intera stringa (delimitatore e tutti) si trova in uno qualsiasi degli elementi dell'array fa qualcosa, altrimenti fai qualcos'altro.

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

risultati:

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

Ho anche provato, if [[ "${NAME}" == *"${SEARCHNAME[@]}"* ]]ma nessuna differenza ... Mi manca qualcosa di abbastanza ovvio qui e sto pensando che potrebbe essere con il modo in cui sto dichiarando il mio array? Mi aspetto che la mancanza di spazio tra ogni elemento dell'array (visto nell'output dell'array) non faccia la differenza a causa dei caratteri jolly?


Non stai aggiungendo elementi dell'array, facilmente controllabili aggiungendo la riga echo "There are ${#SEARCHNAME[@]} members of the array"alla fine dello script. Indica il 1membro. I +=compiti dovrebbero apparire come SEARCHNAME+=("JACK-BLACK").
Deathgrip,

Grazie per la segnalazione. Ho riprovato ma continua a fallire? #!/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}" echo "ELEMENT COUNT: ${#SEARCHNAME[@]}"RisultatiFAILED SEARCH IN: JACK-BLACK JOHN-JAMES CHRIS-TOPHER JEN-NAY FOR NAME: JACK-BLACK ELEMENT COUNT: 4
Chris,

Risposte:


2

Correggere le assegnazioni di array e modificare il test in 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}"

Grazie per aver corretto la mia scarsa sintassi! Inoltre, suppongo di aver usato il comparatore errato per un po 'di tempo. Se lo lascio senza regex, ma cambio i punti in modo che if [[ "${SEARCHNAME[@]}" == *"${NAME}"* ]];funzioni. Grazie per l'aiuto!
Chris,

Userei ancora il =~metodo regex nella mia risposta durante il ==test.
Deathgrip,

1

Ci sono un paio di cose da notare qui:

  1. Usando al ==posto di =~come non stiamo cercando l'uguaglianza qui.
  2. Dal momento che questo regexnon è wildcardcosì ...
  3. L'ordine degli operandi nel [[deve essere invertito, vale a dire, come:

    if [[ ${SEARCHNAME[@]} =~ .*$NAME.* ]]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.