我正在尝试从另一个数组中过滤一个数组。也就是说,我试图创建第三个具有逻辑不相交的数组。
据我所知,这段代码似乎永远不会匹配,并且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")