次の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=
関連