다른 배열의 배열을 필터링하려고 합니다. 즉, 논리적 분리가 있는 세 번째 배열을 만들려고 합니다.
내가 알 수 있는 한, 이 코드는 일치하지 않는 것 같고 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 -p
bash가 변수에 할당한 값을 확인할 수 있습니다.
$ 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")