2つの異なる配列の文字列が一致しませんか?

2つの異なる配列の文字列が一致しませんか?

別の配列の配列をフィルタリングしようとしています。つまり、論理分離を持つ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 -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")

おすすめ記事