나는 항상 bash가 큰따옴표 없이 또는 큰따옴표와 함께 사용할 때 백슬래시를 동일하게 처리한다고 생각했지만 틀렸습니다.
[user@linux ~]$ echo "foo \ "
foo \
[user@linux ~]$ echo foo \ # Space after \
foo
그래서 큰따옴표를 사용할 때 백슬래시가 항상 인쇄된다고 생각했지만 다음과 같습니다.
[user@linux ~]$ echo "foo \" "
foo "
[user@linux ~]$ echo "foo \\ "
foo \
코드의 첫 번째 줄에 백슬래시가 나타나는 이유는 무엇입니까?
답변1
부분3.1.2.3 큰따옴표~의GNU 배쉬 매뉴얼설명하다:
$
백슬래시는 ' ', '`
', '"
', '\
' 또는 문자 중 하나가 뒤에 오는 경우에만 특별한 의미를 유지합니다newline
. 큰따옴표 내에서 이러한 문자 중 하나 뒤에 오는 백슬래시가 제거됩니다. 특별한 의미가 없는 선행 백슬래시 문자는 변경되지 않습니다. 큰따옴표 앞에 백슬래시를 추가하면 큰따옴표 안에 큰따옴표를 넣을 수 있습니다. 활성화되면!
큰따옴표 안에 나타나는 " "이 백슬래시로 이스케이프되지 않는 한 기록 확장이 수행됩니다 . ' ' 앞의 백슬래시는!
제거되지 않습니다.
따라서 \
큰따옴표 처리는 \
작은따옴표 및 외부 따옴표 \
처리와 다릅니다 . 문자를 문자 그대로 처리하는 위치에 있지 않는 한 문자 그대로 처리됩니다. 이 경우 해당 문자는 큰따옴표 안에서 특별한 의미를 가질 수 있습니다.
\'
\?
, 및 와 같은 시퀀스는 문자 \*
그대로 처리되며 이후 백슬래시는 제거되지 않으며 큰 '
따옴표 로 묶인 경우 특별한 의미가 없습니다.?
*
답변2
백슬래시는 상황에 따라 다르게 해석됩니다.
큰따옴표 내(첫 번째 예):
The backslash retains its special meaning only when followed by one of the following characters: $, `, ", \, or <newline>.
따옴표 없이(두 번째 예):
A non-quoted backslash (\) is the escape character. It preserves the literal value of the next character that follows, with the exception of <newline>. If a \<newline> pair appears, and the backslash is not itself quoted, the \<newline> is treated as a line continuation (that is, it is removed from the input stream and effectively ignored).
구문을 사용하면
$'....'
C에서와 마찬가지로 따옴표 안에 표준 백스페이스 문자를 사용할 수 있습니다. 예를 들어 등\n
.\t
백틱 사용:
When the old-style backquote form of substitution is used, backslash retains its literal meaning except when followed by $, `, or \.
인용 출처: bash 매뉴얼
답변3
이것은 "이해를 위해 일을 복잡하게 만드는 것"의 예입니다. 다른 사람들이 따옴표와 백슬래시를 이해하는 데 도움이 되기를 바랍니다.
이 예에서는 패턴을 3번 반복하고 싶습니다.
>~# echo 'ABC\n\t'
ABC\n\t
사용아포스트로피, 이는 매우 간단합니다.
>~# echo 'ABC\n\t' | sed -e 's#ABC\\n\\t#ABC\\n\\tABC\\n\\tABC\\n\\t#'
↑ ↑ ↑ ↑ ↑ ↑ ↑
# These backslashes escaped by sed
ABC\n\tABC\n\tABC\n\t
사용되는 방법입니다큰따옴표: (다시 말하지만 이해하기 복잡함)
>~# echo 'ABC\n\t' | sed -e "s#ABC\\\n\\\t#$(printf '%0.sABC\\\\n\\\\t' $(seq 1 3))#"
↑ ↑ ↑ ↑ ↑ ↑
# These backslashes are removed in double quotes. Showing intermediate stage:
>~# echo 'ABC\n\t' | sed -e "s#ABC\\n\\t#$(printf '%0.sABC\\n\\t' $(seq 1 3))#"
# Expanding printf results in:
>~# echo 'ABC\n\t' | sed -e 's#ABC\\n\\t#ABC\\n\\tABC\\n\\tABC\\n\\t#'
ABC\n\tABC\n\tABC\n\t
그냥 놀면서 따옴표와 백슬래시를 익히려면 printf 주위의 작은 따옴표를 큰 따옴표로 바꾸십시오.