IFSの問題は、割り当てられた区切り文字が2回表示されると発生します。文字列の途中に1回、文字列の最後に1回

IFSの問題は、割り当てられた区切り文字が2回表示されると発生します。文字列の途中に1回、文字列の最後に1回

次のIFSコマンドは予想される出力を提供しません。

$ IFS='=' read -r key value <<< "fram-saml-idp-signing-certificate=MIIDYTCCAkmifzlwq5yziqyU04eP4wLr3cM="; echo "KEY: ${key}";echo "VALUE: ${value}"

出力:

KEY: fram-saml-idp-signing-certificate
VALUE: MIIDYTCCAkmifzlwq5yziqyU04eP4wLr3cM

最後の等号(=)がありません。

ただし、次のコマンドは正しい推定出力を提供します。

$ IFS='=' read -r key value <<< "fram-saml-idp-signing-certificate=MIIDYTCCAkmifzlwq5yziqyU04eP4wLr3cM=="; echo "KEY: ${key}";echo "VALUE: ${value}"

出力:

KEY: fram-saml-idp-signing-certificate
VALUE: MIIDYTCCAkmifzlwq5yziqyU04eP4wLr3cM==

これはバグですかIFS=最後に等号()があるときに正しい出力を得るには、最初のコマンドをどのように変更する必要がありますか?

ベストアンサー1

強力で移植可能なソリューションは、変数とその変数(パラメータ?)拡張を使用することです。

str="fram-saml-idp-signing-certificate=MIIDYTCCAkmifzlwq5yziqyU04eP4wLr3cM="

key=${str%%=*}        # select the string up to the first =
value=${str#"$key="}  # take all that is not the variable above.

echo "KEY: ${key}";echo "VALUE: ${value}"

すべてのBourneシェル(ksh、bash、zsh、古いBourneシェル自体を除く)で動作します。


詳細

「単語の分割」の規則は非常に複雑です(詳細については、以下の関連リンクを読んでください。「特別なケース」がたくさんあります)。

2 つ以上の末尾の区切り記号は次のとおりです。いいえすべてのシェルを削除します。ただし、dash、bash、ksh では末尾の区切り文字が削除されます (ただし、zsh は削除しません)。

選ぶ

強力なソリューションバッシュから正規表現の一致を使用していますか?

str='fram-saml-idp-signing-certificate=MIIDYTCCAkmifzlwq5yziqyU04eP4wLr3cM='

re='^([^=]*)=(.*)';
[[ $str =~ $re ]] && key="${BASH_REMATCH[1]}" value="${BASH_REMATCH[2]}";
echo "KEY: ${key}";echo "VALUE: ${value}"

これにより、以下が(正しく)印刷されます。

KEY: fram-saml-idp-signing-certificate
VALUE: MIIDYTCCAkmifzlwq5yziqyU04eP4wLr3cM=

関連

おすすめ記事