쉘에서 따옴표를 이스케이프 처리하는 방법?


65

bash에서 문자를 이스케이프 처리하는 데 문제가 있습니다. 다른 사용자로 명령을 실행하는 동안 작은 따옴표와 큰 따옴표를 피하고 싶습니다. 이 질문의 목적을 위해 화면에 다음을 에코하고 싶다고 가정 해 봅시다.

'single quote phrase' "double quote phrase"

다른 사용자로 전환 해야하는 경우 모든 특수 문자를 이스케이프 처리하려면 어떻게해야합니까?

sudo su USER -c "echo \"'single quote phrase' \"double quote phrase\"\""

물론 이것이 올바른 결과를 낳지는 않습니다.


"물론 올바른 결과를 얻지 못한다"는 +1 bash나를 화나게 만드는 길에 있습니다.
Rolf

답변:


88

다음 문자열 리터럴 구문을 사용할 수 있습니다.

> echo $'\'single quote phrase\' "double quote phrase"'
'single quote phrase' "double quote phrase"

에서 man bash

$ 'string'형식의 단어는 특별히 취급됩니다. ANSI C 표준에 지정된대로 백 슬래시 이스케이프 문자를 바꾸어 단어를 문자열로 확장합니다. 백 슬래시 이스케이프 시퀀스가있는 경우 다음과 같이 디코딩됩니다.

          \a     alert (bell)
          \b     backspace
          \e
          \E     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \'     single quote
          \"     double quote
          \nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
          \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
          \cx    a control-x character

5
지나침. 대부분의 경우 문자열 리터럴 구문을 사용할 필요가 없습니다.
fpmurphy

자세한 내용은 여기 stackoverflow.com/a/16605140/149221
mj41

12

POSIX 셸에서 문자열에 변수, 명령 또는 기록 확장이없고 줄 바꿈이 없다고 가정하면 다음 기본 처방을 따르십시오.

  1. 작은 따옴표로 일반 문자열을 인용하려면 다음 조치를 수행하십시오.

    1. 선행 및 후행 작은 따옴표가 추가 된 동일한 순서로 작은 따옴표가 아닌 문자 시퀀스를 대체하십시오. 'aaa' ==> ''aaa''

    2. 기존의 작은 따옴표 문자 마다 역 슬래시를 사용 하십시오 ' ==> \'
      . 특히''aaa'' ==> \''aaa'\'

  2. 큰 따옴표로 일반 문자열을 인용하려면 다음 조치를 수행하십시오.

    1. 선행 및 후행 큰 따옴표를 추가하십시오. aaa ==> "aaa"

    2. 큰 따옴표 문자와 백 슬래시 문자마다 백 슬래시를 사용하여 탈출하십시오. " ==> \", \ ==> \\

몇 가지 예 :

''aaa""bbb''ccc\\ddd''  ==>  \'\''aaa""bbb'\'\''ccc\\ddd'\'\'
                        ==>  "''aaa\"\"bbb''ccc\\\\ddd''"

다음과 같이 예제를 확장 할 수 있습니다.

#!/bin/sh

echo \''aaa'\'' "bbb"'
echo "'aaa' \"bbb\""

sudo su enzotib -c 'echo \'\'\''aaa'\''\'\'\'' "bbb"'\'
sudo su enzotib -c 'echo "'\''aaa'\'' \"bbb\""'

sudo su enzotib -c "echo \\''aaa'\\'' \"bbb\"'"
sudo su enzotib -c "echo \"'aaa' \\\"bbb\\\"\""

10

쉘에서 따옴표를 이스케이프 처리하는 간단한 예 :

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

이미 열린 하나 ( ') 를 마무리하고 이스케이프 된 하나 ( \')를 배치 한 다음 다른 하나를 열면 ( ') 완료됩니다.

또는

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

이미 열린 하나 ( ') 를 마무리 하고 다른 따옴표 ( "'")에 따옴표 를 넣은 다음 다른 따옴표 ( )를 열면 '됩니다.

관련 : 작은 따옴표로 묶은 문자열에서 작은 따옴표를 이스케이프 처리하는 방법은 무엇입니까? stackoverflow SE에서


1

허용 된 답변은 간단한 (한 수준) 인용에 효과적입니다.

$ echo $'\'single quote phrase\' "double quote phrase"'
'single quote phrase' "double quote phrase"

명령이 작동하도록하려면 두 번 인용해야합니다.
이 스크립트는 모든 작업을 수행 할 수 있습니다.

#!/bin/bash

quote () { 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

read -r line <<-\_line_to_quote_
'single quote phrase' "double quote phrase"
_line_to_quote_

quote "$line"; echo
quote "echo $(quote "$line")"; echo

스크립트를 실행하여 다음을 얻습니다.

$ script
''\''single quote phrase'\'' "double quote phrase"'
'echo '\'''\''\'\'''\''single quote phrase'\''\'\'''\'' "double quote phrase"'\'''

첫 번째 줄은 간단한 에코를 위해 작동합니다.

$ echo ''\''single quote phrase'\'' "double quote phrase"'
'single quote phrase' "double quote phrase"

두 번째 줄은 큰 따옴표로 묶인 명령에서 작동합니다.

sudo su USER -c 'echo '\'''\''\'\'''\''single quote phrase'\''\'\'''\'' "double quote phrase"'\'''

-3

에코 'I \'ma student '가 작동하지 않습니다. 그러나 다음과 같이 작동합니다.

echo $ 'I \'ma student 'bash의 맨 페이지에서 :

백 슬래시가 앞에 있어도 작은 따옴표 사이에는 작은 따옴표가 없을 수 있습니다. .... $ 'string'형식의 단어는 특별히 취급됩니다. ANSI C 표준에 지정된대로 백 슬래시 이스케이프 문자를 바꾸어 단어를 문자열로 확장합니다.


6
이것은 기존 답변에 아무것도 추가하지 않습니다.
jasonwryan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.