两个不同数组中的字符串不匹配?

两个不同数组中的字符串不匹配?

我正在尝试从另一个数组中过滤一个数组。也就是说,我试图创建第三个具有逻辑不相交的数组。

据我所知,这段代码似乎永远不会匹配,并且found仍然很低:

found=0
...

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

我尝试使用==得到相同的结果。我也尝试过这个X技巧,但这也不起作用(它甚至适用于此吗?)if [ "X$flag" = "X$filtered" ]:。

我仅限于 Bash 3。我使用 Bash 是因为我对它有所了解。我限制为 3 个,因为该脚本也在 OS X 上运行。由于 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 shell 没有。相反,它将它们视为数组元素值的一部分。因此,将上面的定义替换为:

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

相关内容