쉘에서 작은 따옴표를 피할 수있는 방법이 있습니까?


11

예 : 말하고 싶어

perl -e 'print '"'"'Hello, world!'"'"', "\n";'

작은 따옴표를 피하는 것과 같이 덜 어색한 방법이 있습니까?

예, 쓸 수 있다는 것을 알고 있습니다

perl -e 'print q[Hello, world!], "\n"'
perl -e 'print "Hello, world!\n"'

그러나이 질문은 Perl이 아니라 껍질에 인용하는 것에 관한 것입니다.

나는 그것을 수행하는 방법에 관심 bashcsh처음에.

답변:


9

Dennis는 그의 대답에서 일반적인 대안을 지적합니다 (이중 따옴표와 연결된 단일 따옴표, 이중 겹침, 단일 따옴표 문자열; 이미 Perl의 사용자 정의 가능한 따옴표 연산자를 언급했습니다). 에 대한.

Bourne과 같은 쉘 (sh, ksh, ash, dash, bash, zsh 등)에서 작은 따옴표로 묶인 문자열은 완전히 리터럴입니다. 이렇게하면 쉘이 특수하게 처리하지 않고 처리 할 문자를 쉽게 포함시킬 수 있지만 작은 따옴표 문자 자체는 작은 따옴표로 묶인 문자열에 포함될 수 없습니다.

나는 csh 유형 쉘이 다른 측면에서 완전히 깨져 있기 때문에 생각조차하지 않습니다 ( Csh 프로그래밍은 유해한 것으로 간주됩니다 ).


감사합니다. "이것은 불가능하다"-그것은 내가 기대했던 답이다.
codeholic

Perl과 달리 Bourne과 같은 쉘 문서는 stdin을 통한 입력을 제공하는 데만 유용합니다. 물론 작은 따옴표를 넣을 수도 있습니다. 단어 (예 :)를 인용하여 here 문서의 "문자 모드"를 활성화 할 수도 있습니다 blah <<\EOF … EOF. <<'EOF'및 을 사용할 수도 있습니다 <<"EOF. 모두 Perl과 달리 문서의 리터럴을 의미합니다. 당신이 정말로 결정 되었다면, 당신은 할 수 있습니다 blah "$(cat<<\EOF … EOF )" other args(명령 대체에 공백을 쓴 줄 바꿈을 사용하십시오; ksh와 zsh는 고양이 없이 할 수 있습니다 , 다른 사람들은 그것을 필요로합니다). 그러나 정말로 가치가 있습니까?
Chris Johnsen

zsh 작은 따옴표는 문자 그대로가 아닙니다. Zsh는 작은 따옴표로 묶인 문자열의 어디에서나 '\ U'를 문자 코드로 해석하려고합니다 (예 : echo '\U0000068\U000069'echos 'hi'). 쉘의 버그가 아닌 한 왜 그런지 확실하지 않습니다.
Matthew

1
@Matthew :이 \U경우 의 해석은 내장 echo 명령 으로 수행됩니다 (이 동작은 -EBSD_ECHO 옵션 및 으로 제어 할 수 있음 -e). 리터럴 문자열이 다른 명령에서 전달되고 해석되지 않는 것을 볼 수 있습니다. 예 printf %s\\n '\U0000068\U000069'.
Chris Johnsen

@ChrisJohnsen 고마워, 나는 zsh를 처음 접했고 이것을 몰랐지만 당신 말이 맞아. 매뉴얼 페이지에서 나에게 -e가 기본값이라고 말했지만 zsh는이를 무시해야합니다.
Matthew

5

나를 위해 모든 예제는 다음을 생성합니다.

안녕, 세상!

그리고 이것도 마찬가지입니다 :

perl -e 'print "Hello, world!", "\n";'

이:

perl -e 'print '\''Hello, world!'\'', "\n";'

당신이하려는 일을 분명히 할 수 있습니까?

Bash와 같은 쉘에서 따옴표를 문자열의 일부로 인쇄하려는 경우 한 유형의 따옴표가 다른 유형을 이스케이프합니다.

$ echo '"Hello, world!"'
"Hello, world!"
$ echo "'Hello, world!'"
'Hello, world!'

편집하다:

다른 방법이 있습니다.

$ perl -e 'print "\047Hello, world!\047", "\n";'
'Hello, world!'
$ echo -e "\047Hello, world! \047"
'Hello, world! '

느낌표 뒤의 공백은 히스토리 확장 오류를 방지합니다. set +H대신 할 수있었습니다 .


1

이전 답변에 대한 수정 사항이 표시되는지 확실하지 않습니다.

새로운 답변과 동일하게 붙여 넣기 :

다른 접근법 :

솔루션을 시도했을 때 여전히 '를 인쇄 할 수 없었습니다.

하지만 귀하의 솔루션에서 힌트를 얻어 다음을 시도했습니다.

$ perl -e '$foo = chr(39); print "${foo}Hello, world ${foo}", "\n";'
'Hello, world '

'의 ASCII 값은 39입니다.

관심있는 위치에 '를 추가하기 위해 많은 파일을 인라인으로 편집하려면 이것이 필요했습니다.


1

다음 문서는 탈출을 신경 쓰지 않는 가장 좋은 방법입니다.

$ cat <<EOF
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

여기에 인용 된 문서를 사용하여 모든 확장을 완전히 초기화 할 수 있습니다.

$ cat <<'EOF'
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

입력 대신 인수로 전달하려면 xargs를 사용할 수 있습니다.

$ xargs -0 <<'EOF' perl -e
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

0

bash에 이것을 수행하는 옵션이 있는지 모르겠지만 zsh를 사용 ''하면 RC_QUOTES옵션 을 켠 후에 사용할 수 있습니다 . (zsh를 사용하는 것이 좋습니다. 주로 bash와 호환되며 더 많은 호환성을 위해 bash를 에뮬레이트 할 수 있습니다.)

bash (그리고 여전히 zsh를 사용하는 대부분의 시간)에서는 '\''보다 읽기가 쉽기 때문에 사용 합니다 '"'"'.

나는 csh에서 어떻게 해야하는지 전혀 모른다.


-1

펄 스크립트의 일부로 내부적으로 사용될 경우 \ '와 \ "를 사용하여 펄로 따옴표를 이스케이프 처리 할 수 ​​있습니다.


3
너무 쉬웠다면 묻지 않을 것입니다. 답을 게시하기 전에 시도해보고 작동하는지 확인할 수 있습니다.
codeholic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.