IFS 문제는 할당된 구분 기호가 두 번 나타날 때 발생합니다. 문자열 중간에 한 번, 문자열 끝에서 한 번

IFS 문제는 할당된 구분 기호가 두 번 나타날 때 발생합니다. 문자열 중간에 한 번, 문자열 끝에서 한 번

다음 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마지막 변수에 구분 기호를 포함합니다 .ksh88bosh

  • ksh93bash후행 구분 기호가 여러 개인 경우 입력의 수정되지 않은 나머지 부분을 포함합니다 .

POSIX 문:

If there are fewer vars than fields, the last var shall
be set to a value comprising the following elements:

그러나 두 구분 기호 사이의 빈 필드가 하나의 필드로 간주되는지 여부는 설명할 수 없습니다. 따라서 내 이해에 따르면 ksh88동작 ksh93이 정확할 수 있으므로 정확한 동작이 정의되지 않은 것 같습니다.

관련 정보