Bash에서 문자를 이스케이프 처리하는 데 문제가 있습니다. 다른 사용자로 명령을 실행할 때 작은따옴표와 큰따옴표를 이스케이프 처리하고 싶습니다. 이 질문의 목적을 위해 다음 내용을 화면에 표시하고 싶다고 가정해 보겠습니다.
'single quote phrase' "double quote phrase"
다른 사용자로 전환해야 하는 경우 모든 특수 문자를 어떻게 이스케이프할 수 있습니까?
sudo su USER -c "echo \"'single quote phrase' \"double quote phrase\"\""
물론 이렇게 해도 올바른 결과가 나오지 않습니다.
답변1
다음 문자열 리터럴 구문을 사용할 수 있습니다.
> 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
답변2
셸에서 따옴표를 이스케이프 처리하는 간단한 예:
$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc
방법은 이미 열린 것( '
)을 완성하고, 이스케이프된 것( \'
)을 배치한 후, 또 다른 것( '
)을 여는 것입니다.
또는:
$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc
이는 열어 놓은 인용문( '
)을 완성하고, 그 인용문을 다른 인용문( "'"
)에 넣은 다음, 다른 인용문( )을 열어서 '
수행 됩니다.
관련된:작은따옴표로 묶인 문자열에서 작은따옴표를 이스케이프 처리하는 방법은 무엇입니까?스택오버플로우 SE에서
답변3
POSIX 셸에서는 문자열에 변수, 명령 또는 기록 확장이 없고 개행도 없다고 가정하고 다음 기본 규칙을 따릅니다.
작은따옴표를 사용하여 범용 문자열을 인용하려면:
작은따옴표가 아닌 문자 시퀀스를 앞뒤 작은따옴표가 추가된 동일한 시퀀스로 바꿉니다.
'aaa' ==> ''aaa''
백슬래시를 하나씩 건너뛰고 이스케이프하세요기존의작은따옴표 문자:
' ==> \'
특히,''aaa'' ==> \''aaa'\'
큰따옴표를 사용하여 범용 문자열을 인용하려면:
선행 및 후행 큰따옴표를 추가합니다.
aaa ==> "aaa"
모든 큰따옴표 문자와 모든 백슬래시 문자를 이스케이프하려면 백슬래시를 사용하십시오.
" ==> \", \ ==> \\
몇 가지 예를 들면 다음과 같습니다.
''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\\\"\""
답변4
단순한
출력을 파이핑하여 큰따옴표 제거sed
sed 's/"//g'
예
somethingThatProducesDoubleQuotesHere | removeDoubleQuotes
아니면 미래에 삶을 더 편하게 만드는 방법을 사용할 수도 있습니다.
removeDoubleQuotes() {
sed 's/"//g'
# EXAMPLES:
# somethingThatProducesDoubleQuotesHere | removeDoubleQuotes
}