대시에 백슬래시를 사용하여 변수 인쇄

대시에 백슬래시를 사용하여 변수 인쇄

내 껍질은 대시입니다. 내 질문은 다음과 같습니다.

# A="abc\nde fg"
# printf "$A"
abc
de fg#

# B="abc\\nde fg"
# printf "$B"
abc
de fg#

# C="abc\\\nde fg"
# printf "$C"
abc\nde fg# 

내가 사용하고 있는 문자열 변수에는 공백 \n과 다른 공백 문자가 모두 있을 수 있습니다. 문자열에서 변수를 $A이스케이프하지 않고 변수에 액세스하고 싶습니다 . \n작은따옴표를 사용하면 변수로 해석되지 않지만 큰따옴표를 사용하면 이러한 특수 문자를 해석합니다.

dash 이를 수행하는 방법이 쉘에 내장되어 있습니까? 문자열의 이스케이프 문자를 두 배로 늘리는 외부 프로그램에 변수를 보낼 수 있다는 것을 알고 있지만 이는 옳지 않다고 생각됩니다.

편집하다:

나는 내 실수를 알고 있지만 printf이 사건과는 아무 관련이 없습니다. 처음에 나는 을 사용하고 있었습니다 echo. 이것은 내가 요구하는 것의 더 좋은 예입니다. 다음은 두 개의 동일한 명령 시퀀스입니다. 단, 첫 번째는 bash에 있고 두 번째는 dash에 있습니다.

세게 때리다

$ cat sample.txt
abc\nde fg

some string

$ A=`cat sample.txt`
$ echo "$A"
abc\nde fg

some string
$ 

스프린트

$ cat sample.txt
abc\nde fg

some string

$ A=`cat sample.txt`
$ echo "$A"
abc
de fg

some string
$ 

\n이 일련의 명령을 해석하지 않도록 대시를 얻을 수 있는지 궁금합니다 . 외부 명령을 사용하여 해결 방법을 구현했습니다. 올바르게 사용하면 printf원하는 효과를 얻을 수 있지만 대시 셸 자체에서 이를 수행할 수 있는 방법이 있는지 궁금합니다.

완전성을 기하기 위해 이것이 질문을 하는 이유입니다. 파일을 읽고 조건에 따라 하단 섹션에 주석을 달거나 주석을 제거해야 합니다. 첫 번째 부분에는 리터럴 \n(개행 문자 아님)이 있으며 다시 작성된 파일에서 그대로 유지되어야 합니다.

나는 sed를 사용하여 파일을 두 부분으로 나누고 백틱으로 묶은 다음 변수에 할당합니다. 마지막으로 조건부로 주석을 달거나 주석을 달지 않거나 그대로 두는 것과 "$VAR1$VAR2"같은 작업을 수행하여 변수를 연결합니다 .$VAR2

답변1

아니요, 변형이 많습니다 echo. echo휴대용 명령이 아닙니다.

dash실제로 echo소수의 UNIX 호환 구현 중 하나입니다 echo(적어도 이 점에서는 dash멀티바이트를 지원하지 않으므로 멀티바이트 로케일을 지원하는 시스템과 호환되지 않습니다).

UNIX 사양 요구 사항

echo '\n'

두 개의 개행 문자를 출력하고

echo -e x

출력 -e x<newline>.

kshAT& T 와 같은 일부 다른 셸에는 bash내장 명령의 동작을 변경하는 설정이 yash있지만 (GNU 명령의 동작은 환경의 영향을 받을 수도 있음) 현재 .zshechoechodash

어쨌든 echo임의의 데이터를 출력하는 데 사용하고 싶지는 않습니다. 표준 및 이식 가능한 명령은 입니다 printf.

echo다양한 래퍼 기능을 구현하는 방법을 포함한 자세한 내용은 다음 답변에서 확인할 수 있습니다 .printf왜 printf가 echo보다 나은가요?

답변2

문제는 Bash와 Dash 모두 echo내장 기능이 있지만 다음을 포함하는 문자열이 주어지면 두 구현이 동일하게 동작하지 않는다는 것입니다 \.

echo 'abc\ndef'

이로 인해 두 쉘에서 서로 다른 결과가 생성됩니다.


;를 사용하여 일관된 출력을 얻을 수 있습니다 printf '%s\n'. 이 함수도 내장 함수이지만 두 셸 모두에서 동일한 출력을 생성합니다(모든 변환이 수행되는 것은 아닙니다. 예를 들어 bash는 %q대시가 제공하지 않는 변환을 제공합니다).

printf '%s\n' 'abc\ndef'

그러면 abc\ndef두 개의 껍질이 생깁니다.


echoLinux에서 echo의 외부 구현을 사용하여 coreutilsGNU를 제공 할 수도 있습니다 /bin/echo.

/bin/echo 'abc\ndef'

그러나 이것은 이식성이 좋지 않다는 점에 유의하십시오. GNU 정보 파일에는 다음과 같은 내용이 있습니다.

POSIX는 옵션에 대한 지원을 요구하지 않습니다. 즉, echo문자열에 백슬래시가 포함되어 있거나 첫 번째 인수가 포함된 경우 동작은 구현에 따라 정의됩니다 -n. 이식 가능한 프로그램이 printf후행 줄 바꿈을 생략하거나 제어 문자 또는 백슬래시를 출력해야 하는 경우 이 명령을 사용할 수 있습니다.

답변3

printf형식 문자열에 의해 삽입된 값이 아닌 변수를 형식 문자열로 사용합니다 .

사용하거나 의도한 대로 사용하십시오 echo. printf여기 몇 가지 예가 있어요.

A="abc\nde fg" B="abc\\nde fg" C="abc\\\nde fg"
echo "$A"
abc\nde fg

echo "$B"
abc\nde fg

echo "$C"
abc\\nde fg

printf "%s\n" "$A"
abc\nde fg

printf "Here is variable B: %s\n" "$B"
Here is variable B: abc\nde fg

printf "> %s <\n" "$C"
> abc\\nde fg <

\그런데, 큰따옴표로 묶인 문자열을 사용하여 구문 분석하고 백슬래시 문자를 처리합니다. 작은따옴표로 묶인 문자열을 사용하여 변수를 정의하는 경우 \전체 문자 집합을 보존할 수도 있습니다 .

A='abc\nde fg' B='abc\\nde fg' C='abc\\\nde fg'

echo "$A"
abc\nde fg

echo "$B"
abc\\nde fg

echo "$C"
abc\\\nde fg

관련 정보