따옴표를 사용할 때 단일 백슬래시가 나타나는 이유는 무엇입니까?

따옴표를 사용할 때 단일 백슬래시가 나타나는 이유는 무엇입니까?

나는 항상 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 주위의 작은 따옴표를 큰 따옴표로 바꾸십시오.

관련 정보