[unix] bash 스크립트에서 변수에 줄 바꿈을 추가하는 방법

내가 할 때

str="Hello World\n===========\n"

나도 \n인쇄물을 얻 습니다. 그러면 줄 바꿈을 어떻게 할 수 있습니까?



답변

에서 bash당신은 구문을 사용할 수 있습니다

str=$'Hello World\n===========\n'

작은 따옴표 앞에는 $이스케이프 시퀀스를 문자열에 삽입 할 수있는 새로운 구문이 있습니다.

또한 printf내장은 결과 출력을 변수에 저장할 수 있습니다

printf -v str 'Hello World\n===========\n'

두 솔루션 모두 서브 쉘이 필요하지 않습니다.

다음에서 문자열을 인쇄해야하는 경우 다음 예와 같이 큰 따옴표를 사용해야합니다.

echo "$str"

따옴표없이 문자열을 인쇄하면 줄 바꿈이 공백으로 변환되기 때문입니다.


답변

작은 따옴표 (Bourne / POSIX 스타일 쉘) 안에 리터럴 개행을 넣을 수 있습니다.

str='Hello World
===========
'

여러 줄 문자열의 경우 여기 문서 가 종종 편리합니다. 문자열은 명령에 입력으로 공급됩니다.

mycommand <<'EOF'
Hello World
===========
EOF

문자열을 변수에 저장하려면 cat명령 대체에서 명령을 사용하십시오 . 문자열 끝에있는 줄 바꿈 문자는 명령 대체에 의해 제거됩니다. 마지막 줄 바꿈을 유지하려면 끝에 마개를 놓고 나중에 제거하십시오. POSIX 호환 쉘에서는 str=$(cat <<'EOF'); str=${str%a}heredoc을 적절히 쓸 수 있지만 bash는 heredoc이 닫는 괄호 앞에 나타나도록 요구합니다.

str=$(cat <<'EOF'
Hello World
===========
a
EOF
); str=${str%a}

ksh, bash 및 zsh에서 $'…'인용 된 양식을 사용하여 인용 부호 내에서 백 슬래시 이스케이프를 확장 할 수 있습니다 .

str=$'Hello World\n===========\n'


답변

“에코”를 사용하고 있습니까? “echo -e”를 시도하십시오.

echo -e "Hello World\n===========\n"


답변

스크립트에 줄 바꿈이 여러 번 필요한 경우 줄 바꿈이있는 전역 변수를 선언 할 수 있습니다. 그렇게하면 큰 따옴표로 묶은 문자열 (가변 확장)에 사용할 수 있습니다.

NL=$'\n'
str="Hello World${NL} and here is a variable $PATH ===========${NL}"


답변

모든 토론에서 가장 간단한 방법은 다음과 같습니다.

bash$ str="Hello World
==========="
bash$ echo "$str"
Hello World
===========

에코 명령을 사용해야합니다 따옴표 .


답변

기존의 훌륭한 답변을 보완하려면 :

당신이 사용하는 경우 bash당신이 선호 읽기 쉽도록 실제 줄 바꿈을 사용하여 , read또 다른 옵션 변수에 여기-문서를 캡처 (여기에 다른 솔루션과 같은) 서브 쉘의 사용을 필요로하지 않습니다.

# Reads a here-doc, trimming leading and trailing whitespace.
# Use `IFS= read ...` to preserve it (the trailing \n, here).
read -r -d '' str <<'EOF'   # Use `IFS= read ...` to preserve the trailing \n
Hello World
===========
EOF
# Test: output the variable enclosed in "[...]", to show the value's boundaries.
$ echo "$str"
[Hello World
===========]
  • -r그 보장 read(기본적으로는 특별한 백 슬래시를 치료하는 것입니다,하지만이 거의 필요하지 않습니다) 입력을 해석하지 않습니다.

  • -d ''“레코드”구분 기호를 빈 문자열로 설정하여 한 줄이 아닌 전체 입력을 한 번 read에 읽습니다 .

두어 유의 $IFS, 디폴트로 (내부 필드 세퍼레이터) $' \t\n'(공간, 탭, 개행)를 임의의 선행 및 후행 공백이 트리밍 에 할당 된 값에서 $str여기에-문서의 후미 개행을 포함한다.
here-doc의 본문은 시작 구분 기호 ( 여기) 다음 줄 부터 시작 하지만 앞에 새 줄이 포함 'EOF'되지 않습니다 .

일반적으로이 원하는 동작입니다,하지만 당신은 줄 바꿈 후행 것을 원하는 경우, 사용 IFS= read -r -d ''대신의 read -r -d '', 그러나주의 모든 선행 및 후행 공백이 후 유지됩니다.
( 명령 앞에 IFS= 직접 추가 하면 해당 read명령 중에 만 할당이 적용되므로 이전 값을 복원 할 필요가 없습니다.)


here-doc을 사용하면 선택적으로 들여 쓰기사용 하여 가독성을 위해 여러 줄 문자열을 설정할 수 있습니다 .

# Caveat: indentation must be actual *tab* characters - spaces won't work.
read -r -d '' str <<-'EOF' # NOTE: Only works if the indentation uses actual tab (\t) chars.
    Hello World
    ===========
EOF
# Output the variable enclosed in "[...]", to show the value's boundaries.
# Note how the leading tabs were stripped.
$ echo "$str"
[Hello World
===========]

here-doc 구분 기호 ( , here) -사이에 배치 하면 here-doc 본문과 닫는 구분 기호에서 선행 탭 문자가 제거되지만 공백이 아닌 실제 탭 문자 에서만 작동 합니다. 편집기는 탭 키 누르기를 공백으로 변환하므로 추가 작업이 필요합니다.<<'EOF'


답변

당신은 이런 식으로해야합니다 :

STR=$(echo -ne "Hello World\n===========\n")

최신 정보:

프레드가 지적했듯이이 방법으로 후행 “\ n”을 잃게됩니다. 백 슬래시 시퀀스가 ​​확장 된 변수를 지정하려면 다음을 수행하십시오.

STR=$'Hello World\n===========\n\n'

테스트 해보자.

echo "[[$STR]]"

우리에게 지금 :

[[Hello World
===========

]]

$ ”는 $ “”과 다릅니다. 두 번째는 현재 로케일에 따라 번역을 수행합니다. 자세한 내용은의 QUOTING 섹션을 참조하십시오 man bash.