別の配列の配列をフィルタリングしようとしています。つまり、論理分離を持つ3番目の配列を作成しようとします。
私が知っている限り、このコードは一致しないようで、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")