서로 다른 두 배열의 문자열이 일치하지 않습니까?

서로 다른 두 배열의 문자열이 일치하지 않습니까?

다른 배열의 배열을 필터링하려고 합니다. 즉, 논리적 분리가 있는 세 번째 배열을 만들려고 합니다.

내가 알 수 있는 한, 이 코드는 일치하지 않는 것 같고 found여전히 낮습니다.

found=0
...

if [ "$flag" = "$filtered" ]; then
    found=1
fi

.get 을 사용해 보았지만 ==동일한 결과가 나왔습니다. 나는 또한 이 X트릭을 시도했지만 그것도 작동하지 않았습니다. (여기에서도 작동합니까?) if [ "X$flag" = "X$filtered" ]:.

나는 Bash 3으로 제한되어 있습니다. 나는 Bash에 대해 알고 있기 때문에 Bash를 사용합니다. 스크립트가 OS X에서도 실행되기 때문에 3으로 제한했습니다. Bash 3 이후로 HashMaps와 같은 유용한 기능을 많이 놓치고 있는 것 같습니다.

문자열이 일치하지 않는 이유는 무엇입니까?


다음은 관련 스니펫입니다. CXXFLAGS사용자가 자신의 환경에서 설정할 수 있습니다. -DDEBUG, -DNDEBUG-O0최적화 와 같이 테스트 스크립트에서 명시적으로 테스트하는 플래그를 제거하려고 합니다 -O1.

# Respect user's preferred flags, but filter the stuff we expliclty test
FILTERED_CXXFLAGS=("-DDEBUG", "-DNDEBUG", "-O0", "-O1", "-O2", "-O3", "-Os", "-Og")
# Additional CXXFLAGS we did not filter
RETAINED_CXXFLAGS=("")

if [ ! -z "CXXFLAGS" ]; then
    TEMP_CXXFLAGS=$(echo "$CXXFLAGS" | sed 's/\([[:blank:]]*=[[:blank:]]*\)/=/g')
    IFS=' ' read -r -a TEMP_ARRAY <<< "$TEMP_CXXFLAGS"

    for flag in "${TEMP_ARRAY[@]}"
    do
        echo "Flag: $flag"
        found=0
        for filtered in "${FILTERED_CXXFLAGS[@]}"
        do
            echo "Filtered: $filtered"
            if [ "$flag" = "$filtered" ]; then
                echo "Found: $flag"
                found=1
            fi
        done
        echo "Found: $found"
        if [ "$found" -eq "0" ]; then
            echo "Retaining $flag"
            RETAINED_CXXFLAGS+=($temp)
        else
            echo "Discarding $temp"
        fi
    done
fi

이것이 배치 표시입니다 echo's. 테스트 데이터는 간단합니다.export CXXFLAGS="-DNDEBUG -g2 -O3 -mfpu=neon"

Flag: -DNDEBUG
Filtered: -DDEBUG,
Filtered: -DNDEBUG,
Filtered: -O0,
Filtered: -O1,
Filtered: -O2,
Filtered: -O3,
Filtered: -Os,
Filtered: -Og
Found: 0
Retaining -DNDEBUG
Flag: -g2
Filtered: -DDEBUG,
Filtered: -DNDEBUG,
Filtered: -O0,
Filtered: -O1,
Filtered: -O2,
Filtered: -O3,
Filtered: -Os,
Filtered: -Og
Found: 0
Retaining -g2
Flag: -O3
Filtered: -DDEBUG,
Filtered: -DNDEBUG,
Filtered: -O0,
Filtered: -O1,
Filtered: -O2,
Filtered: -O3,
Filtered: -Os,
Filtered: -Og
Found: 0
Retaining -O3
Flag: -mfpu=neon
Filtered: -DDEBUG,
Filtered: -DNDEBUG,
Filtered: -O0,
Filtered: -O1,
Filtered: -O2,
Filtered: -O3,
Filtered: -Os,
Filtered: -Og
Found: 0
Retaining -mfpu=neon

답변1

FILTERED_CXXFLAGS쉼표가 있기 때문에 일치하지 않지만 ${TEMP_ARRAY[@]}다음은 일치하지 않습니다.

Flag: -DNDEBUG
Filtered: -DDEBUG,
Filtered: -DNDEBUG,

쉼표가 있어야 하는 경우 다음을 바꾸세요.

if [ "$flag" = "$filtered" ]; then

그리고:

if [ "$flag" = "${filtered%%,}" ]; then

또는 쉼표가 없어야 하는 경우 문제는 다음과 같습니다.

FILTERED_CXXFLAGS=("-DDEBUG", "-DNDEBUG", "-O0", "-O1", "-O2", "-O3", "-Os", "-Og")

이를 사용하여 declare -pbash가 변수에 할당한 값을 확인할 수 있습니다.

$ declare -p FILTERED_CXXFLAGS
declare -a FILTERED_CXXFLAGS='([0]="-DDEBUG," [1]="-DNDEBUG," [2]="-O0," [3]="-O1," [4]="-O2," [5]="-O3," [6]="-Os," [7]="-Og")'

각 요소의 값에 쉼표가 포함되어 있는 것을 볼 수 있습니다. 비록 많은 언어필요하다배열 요소는 Unix 셸에는 없는 쉼표로 구분됩니다. 대신 배열 요소 값의 일부로 처리됩니다. 따라서 위의 정의를 다음으로 바꾸십시오.

FILTERED_CXXFLAGS=("-DDEBUG" "-DNDEBUG" "-O0" "-O1" "-O2" "-O3" "-Os" "-Og")

관련 정보