bash -c에서 에코로 따옴표 표시

bash -c에서 에코로 따옴표 표시

나는 I say "Hello, World!"응답하려고 노력했다 bash -c. 내가 시도한 내용은 다음과 같습니다(일부).

$ bash -c "echo I say \"Hello, World"'!'"\""
$ bash -c "echo I say "'"'"Hello, World"'!'"\""
$ bash -c "echo I say """Hello, World"""'!'
$ bash -c $'echo I say \"Hello, World!\"'
$ bash -c 'echo I say "Hello, World!"'

그들은 모두 인쇄합니다

I say Hello, World!

견적을 어떻게 표시할 수 있나요?

답변1

문제는 중첩된 따옴표가 있어 인용이 다소 복잡해진다는 것입니다. 의 인수에 대한 "전체" 참조가 없으므로 echo모든 시도(세 번째 시도 (1)echo ​​제외)는 실제로 3개의 인수를 에 전달합니다.견적 삭제:

  • I
  • say
  • Hello, World!

중요한 점은 "outer" 명령을 해석할 때 to 매개변수의 외부 따옴표가 bash -c제거된다는 것입니다. 내부 따옴표는 이스케이프 처리되었거나 외부 따옴표와 유형이 다르기 때문에 여전히 존재합니다.

그런 다음 bash명시적으로 호출한 인스턴스가 해당 매개변수("내부" 명령)를 처리할 때 호출 매개변수를 해석할 때 자체적으로 따옴표 제거를 수행합니다 echo. 따라서 귀하가 인용한 내용은 Hello, World!이것이 고려되도록 보장할 것입니다.하나하지만 echo동일한 프로세스에서 삭제되어 손실됩니다 echo.

("inner") 명령 echo에서는 변수 확장이 필요하지 않으므로 다음과 같은 작은따옴표 구문을 사용하겠습니다.

bash -c 'echo "I say \"Hello, World\"!"'

이렇게 하면 매개변수를 전달할 수 echo있으며 큰따옴표 내에서 인용 이스케이프 처리가 예상대로 작동합니다.


(1) 세 번째 시도에서는 실제로 다음 인수 2개를 전달하고 있습니다 bash -c.

  • echo I say Hello,그리고
  • World!

~로 이어지다4개echo"내부" 명령으로 표시되는 매개변수입니다. 이는 """외부 큰따옴표를 "중단"하려는 방식이 작동하지 않기 때문입니다 . 대신 이러한 큰따옴표 중 첫 번째는 인수의 시작 큰따옴표가 bash -c공백 뒤에서 닫혀 있음을 의미합니다. 그런 다음 이는 마치 빈 큰따옴표로 묶인 문자열이 뒤에 오는 것처럼 처리됩니다.인용되지 않음 Hello,. 이들 사이에는 공백이 없기 때문에 모두 연결됩니다.

그런 다음 다음 공백은 보호되지 않으므로 외부는 bash이제 나머지를 두 번째 인수로 처리합니다(다시 따옴표 없이) World, 큰따옴표로 묶인 빈 문자열, 그리고 닫혀 있지만 닫히지 않은 큰따옴표 문자열 로 시작합니다 '!'. 제대로 닫히지 않는다는 사실은 "이벤트를 찾을 수 없음"에 대한 오류 메시지로 가려집니다. 여는 큰따옴표는 다음의 작은따옴표를 인쇄할 단일 문자로 만들고 따라서 !더 이상 기록 참조용으로 해석되지 않기 때문입니다.

답변2

POSIX 준수에 관심이 없다면 -e(16진수) 또는 (8진수) echoASCII 코드를 추가하고 인쇄하여 "문제를 해결할 수 있습니다.\x22\042

bash -c 'echo -e "I say \x22Hello, World\x22"'

bash -c 'echo -e "I say \042Hello, World\042"'

관련 정보