답변:
Dennis는 그의 대답에서 일반적인 대안을 지적합니다 (이중 따옴표와 연결된 단일 따옴표, 이중 겹침, 단일 따옴표 문자열; 이미 Perl의 사용자 정의 가능한 따옴표 연산자를 언급했습니다). 에 대한.
Bourne과 같은 쉘 (sh, ksh, ash, dash, bash, zsh 등)에서 작은 따옴표로 묶인 문자열은 완전히 리터럴입니다. 이렇게하면 쉘이 특수하게 처리하지 않고 처리 할 문자를 쉽게 포함시킬 수 있지만 작은 따옴표 문자 자체는 작은 따옴표로 묶인 문자열에 포함될 수 없습니다.
나는 csh 유형 쉘이 다른 측면에서 완전히 깨져 있기 때문에 생각조차하지 않습니다 ( Csh 프로그래밍은 유해한 것으로 간주됩니다 ).
blah <<\EOF … EOF
. <<'EOF'
및 을 사용할 수도 있습니다 <<"EOF
. 모두 Perl과 달리 문서의 리터럴을 의미합니다. 당신이 정말로 결정 되었다면, 당신은 할 수 있습니다 blah "$(cat<<\EOF … EOF )" other args
(명령 대체에 공백을 쓴 줄 바꿈을 사용하십시오; ksh와 zsh는 고양이 없이 할 수 있습니다 , 다른 사람들은 그것을 필요로합니다). 그러나 정말로 가치가 있습니까?
echo '\U0000068\U000069'
echos 'hi'). 쉘의 버그가 아닌 한 왜 그런지 확실하지 않습니다.
\U
경우 의 해석은 내장 echo 명령 으로 수행됩니다 (이 동작은 -E
BSD_ECHO 옵션 및 으로 제어 할 수 있음 -e
). 리터럴 문자열이 다른 명령에서 전달되고 해석되지 않는 것을 볼 수 있습니다. 예 printf %s\\n '\U0000068\U000069'
.
나를 위해 모든 예제는 다음을 생성합니다.
안녕, 세상!
그리고 이것도 마찬가지입니다 :
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
대신 할 수있었습니다 .
다음 문서는 탈출을 신경 쓰지 않는 가장 좋은 방법입니다.
$ 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
bash에 이것을 수행하는 옵션이 있는지 모르겠지만 zsh를 사용 ''
하면 RC_QUOTES
옵션 을 켠 후에 사용할 수 있습니다 . (zsh를 사용하는 것이 좋습니다. 주로 bash와 호환되며 더 많은 호환성을 위해 bash를 에뮬레이트 할 수 있습니다.)
bash (그리고 여전히 zsh를 사용하는 대부분의 시간)에서는 '\''
보다 읽기가 쉽기 때문에 사용 합니다 '"'"'
.
나는 csh에서 어떻게 해야하는지 전혀 모른다.