echo를 사용할 때 새 줄을 추가하는 방법

echo를 사용할 때 새 줄을 추가하는 방법

다음 명령이 생성된 파일에 새 줄을 삽입하지 않는 이유는 무엇이며 해결 방법은 무엇입니까?

$ echo "Line 1\r\nLine2" >> readme.txt

$ cat readme.txt 
Line 1\r\nLine2

답변1

-e 플래그를 echo에 전달하여 다음과 같이 "\r\n"과 같은 이스케이프 문자를 구문 분석하도록 합니다.

echo -e "Line 1\r\nLine2" >> readme.txt

답변2

echo


echo이렇게 하면 단일 Unix 사양을 엄격하게 준수하는 구현에서 개행 문자가 추가됩니다.

echo 'line1\nline2'

그러나 이는 신뢰할 수 있는 동작이 아닙니다. 실제로는아니요기대할 수 있는 모든 표준 동작 echo.

피연산자

string

표준 출력에 기록될 문자열입니다. 첫 번째 피연산자가 이거나 -n피연산자가 다음을 포함하는 경우\<백슬래시>성격,결과는 구현에 따라 정의됩니다..

존재하다XSI 표준 준수시스템에서 첫 번째 피연산자가 이면 -n문자열로 처리되어야 합니다 .옵션이 아니다. 모든 인수에서 XSI 호환 시스템에서는 다음 문자 시퀀스가 ​​인식됩니다.

\a-를 쓰다<경고>.

\b-를 쓰다<백스페이스 키>.

\c- 억제<줄 바꿈>그렇지 않으면 출력의 마지막 인수를 따릅니다. 매개변수의 다음 문자는 모두 \c무시됩니다.

\f-를 쓰다<페이지 변경>.

\n-를 쓰다<줄 바꿈>.

\r-를 쓰다<엔터>.

\t-를 쓰다<탭>.

\v-를 쓰다<세로탭>.

\\-를 쓰다<백슬래시>특징.

\0num- 0, 1, 2, 3자리의 8진수인 8비트 값을 씁니다.num.

echo따라서 일반적으로 그렇게 하는 것에 의존할 수 없다면 write newline을 사용하는 방법을 알 수 있는 일반적인 방법은 없습니다 echo.

셸은 bash일반적으로 다음을 수행합니다.아니요사양, 취급 및 기타 옵션을 준수 -n하지만 그것조차 불확실합니다. 넌 할 수있어:

shopt -s xpg_echo
echo hey\\nthere

hey
there

그리고그것도 아니고빌드 타임 옵션을 사용하여 빌드한 경우 bash이는 필요합니다 ...

--enable-xpg-echo-default

기본적으로 echo확장된 백슬래시 이스케이프 문자가 내장되어 있으므로 이 -e옵션은 필요하지 않습니다. 이는 기본값을 설정합니다.xpg_echo주택 옵션on, 이는 Bash가 echo단일 Unix 사양 버전 3에 지정된 버전과 더 유사하게 작동하도록 만듭니다. 보다Bash 내장 기능, 인식된 이스케이프 시퀀스에 대한 설명입니다 echo.


printf


반면에 printf의 행동은 비교적 온화합니다.

근본적인

printf유틸리티는 이전에 에서 제공했던 서비스를 제공하기 위해 추가되었습니다 echo.화해할 수 없는 차이기존 버전 중에서 이 버전에는 9판 시스템의 하나를 기반으로 하는 echo이 새로운 유틸리티에 남아 있는 몇 가지 특수 기능이 있습니다 .printf

확장된 설명 부분이 거의 정확히 일치합니다.printf()파일 형식 표기법으로 설명되어 있지만 ISO C 표준의 기능XBD 파일 형식 표기.

%b인수를 설명하는 형식 문자열을 처리합니다. 이는 여러 가지가 될 수 있지만 문자열의 경우 yte 문자열 또는 리터럴 문자열 과 거의 같습니다 %s. %f첫 번째 인수의 형식 지정 과는 %b별도로 이스케이프를 처리하지 않는다는 점을 제외하면 yte 문자열 인수 와 가장 유사하게 작동합니다 \c.

printf ^%b%s$ '\n' '\n' '\t' '\t'

^
\n$^    \t$

바라보다printf더 나은가요 echo?더 알아보기.


echo() printf


예를 들어 자신만의 표준을 작성할 수 있습니다 echo.

echo(){
    printf '%b ' "$@\n\c"
}

...이것은 항상 자동으로 올바른 작업을 수행해야 합니다.

\n사실, 아니요... 마지막 인수가 홀수로 끝나면 인수 끝에 리터럴을 인쇄합니다.<백슬래시>.

하지만 그렇지 않습니다:

echo()
    case    ${IFS- } in
    (\ *)   printf  %b\\n "$*";;
    (*)     IFS=\ $IFS
            printf  %b\\n "$*"
            IFS=${IFS#?}
    esac

답변3

내가 사용한 모든 버전의 bash에서는 문자열이 완전히 인용된 경우 문자열에 대화형으로 또는 스크립트에 리터럴 개행 문자를 간단히 삽입할 수 있습니다.

인터렉티브:

$ echo "Line one
> Line two"
Line one
Line two
$

스크립트에서:

echo "Line one
Line two"

답변4

사람들은 적절한 답을 주었지만 나는 echo 가 echo 이외의 옵션을 허용하는 세상을 받아들이기를 거부합니다 -n.

nl='
'
echo Line 1"$nl"Line 2"$nl"Line 3

관련 정보