내 껍질은 대시입니다. 내 질문은 다음과 같습니다.
# 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>
.
ksh
AT& T 와 같은 일부 다른 셸에는 bash
내장 명령의 동작을 변경하는 설정이 yash
있지만 (GNU 명령의 동작은 환경의 영향을 받을 수도 있음) 현재 .zsh
echo
echo
dash
어쨌든 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
두 개의 껍질이 생깁니다.
echo
Linux에서 echo의 외부 구현을 사용하여 coreutils
GNU를 제공 할 수도 있습니다 /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