(POSIX) 쉘 변수에 개행을 올바르게 저장하는 방법은 무엇입니까? [복사]

(POSIX) 쉘 변수에 개행을 올바르게 저장하는 방법은 무엇입니까? [복사]

고쳐 쓰다자세한 정보를 명확히 하기 위해 예제를 사용하고 다음 쉘 명령을 실행해 보십시오.

SHELLVARIABLE="1st line,
2nd line,
3rd line,
" 
printf '%s' "$SHELLVARIABLE"

다음 출력을 생성합니다.

1st line,<newline>2nd line,<newline>3rd line,<newline>

<newline>역할은 0x0a/ 입니까 \n?

원래 문제 설명

올바른(POSIX 확인) 저장 방법은 무엇입니까?새로운 팀문자 0x0a(commen c 스타일 escap이라고도 함 \n)는 셸 변수로 변환됩니다.

나는 다음을 확실히 하고 싶다:

SHELLVARIABLE="
"

예, 그것은 단순한 우연이 아니라 실제로 올바른 접근 방식입니다.

POSIX 이후인쇄 기능printf '\n'개행 문자(예: , 또는 ) 를 완전히 생성할 수 있습니다. printf '%b' '\0012'먼저 더 명시적인(? 또는 올바른?) 형식을 시도했습니다.

SHELLVARIABLE="$(printf '\n')"

이는 유혹적인 접근 방식이지만,아니요일하다. 에 따르면기준, 명령 대체(예: $()및 를 통한 ` `)를 제거해야 합니다.

하나 이상의 순서새로운 팀교체가 끝나면 s입니다.

참고: 단일 후행 개행 문자를 셸 변수에 저장해야 한다는 요구 사항은 보다 일반적인 사용 사례(답변을 구합니다)를 추상화하기 위한 것입니다. 이는 다음으로 시작하는 POSIX 셸 변수에 문자열을 저장하는 방법입니다.새로운 팀특징.

답변1

인용된 문자열에 하드 개행 문자를 사용해도 괜찮습니다.

개인적으로 나는 단지 개행 문자를 원한다면 그것을 피하고 싶습니다. 이상해 보이고 실수로 첫 번째 줄 끝에 추가 공백을 칠 위험이 약간 있습니다(예를 들어 <space><newline>). 하지만 그게 바로 나야.

명령 대체가 제거됩니다.뒤따라줄 바꿈 문자이지만 이것만 가능합니다. 해결 방법은 마지막 문자가 개행 문자가 아닌지 확인한 다음 해당 문자를 제거하는 것입니다.

이 두 가지 모두 개행 문자를 제공해야 합니다.

nl1='
'

nl2="$(printf '\nx')"
nl2="${nl2%x}"

관련 정보