다음 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 쉘 자체 제외)과 작동합니다.
세부 사항
"단어 분할"에 대한 규칙은 매우 복잡합니다(자세한 내용은 아래 관련 링크를 읽어보십시오. "특별한 경우"가 많이 있습니다).
두 개 이상의 후행 구분 기호는 다음과 같습니다.아니요모든 껍질을 제거하십시오. 그러나 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=
관련된
답변2
단일 구분 기호로 끝나는 마지막 필드의 경우 알려진 모든 쉘이 동의하고 구분 기호를 제거합니다.
후행 구분 기호가 여러 개인 경우 상황에 따라 다르며 특정 동작을 기대할 수 있는지 의문입니다.
Bourne Shell
, 및 의 POSIX 변형은 뒤에 비어 있지 않은 필드가 있는 경우에만ksh88
마지막 변수에 구분 기호를 포함합니다 .ksh88
bosh
ksh93
bash
후행 구분 기호가 여러 개인 경우 입력의 수정되지 않은 나머지 부분을 포함합니다 .
POSIX 문:
If there are fewer vars than fields, the last var shall
be set to a value comprising the following elements:
그러나 두 구분 기호 사이의 빈 필드가 하나의 필드로 간주되는지 여부는 설명할 수 없습니다. 따라서 내 이해에 따르면 ksh88
동작 ksh93
이 정확할 수 있으므로 정확한 동작이 정의되지 않은 것 같습니다.