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.* ]]
    

관련 정보