큰따옴표로 묶인 $'\n'이 작동하지 않습니다.

큰따옴표로 묶인 $'\n'이 작동하지 않습니다.

개행 문자가 포함된 문자열을 다음과 같이 프로그램에 명령줄 인수로 보내고 싶습니다.

myprogram Hello$'\n'World

그러나 문자열에 큰따옴표를 사용하면 다음과 같습니다.

myprogram "Hello$'\n'World Hello Again"

그러면 수신된 문자열 에는 개행 문자 대신 myprogram해당 문자열이 포함됩니다 .$'\n'

답변1

이 구문을 인용하면 $'…'아무런 효과가 없습니다 . 사용:

$ myprogram "Hello"$'\n'"World Hello Again"

또는

$ myprogram Hello$'\n'World\ Hello\ Again

또는

$ a=$'\n'
$ myprogram "Hello${a}World Hello Again"

또는

$ myprogram "$(echo -e 'Hello\nWorld Hello Again')"

또는

$ myprogram "Hello
World Hello Again"

답변2

문자열을 포괄적인 따옴표 쌍으로 묶을 필요는 없습니다. 개별적으로 인용된 문자열을 단일 단어로 연결할 수 있습니다.

myprogram Hello$'\n'"World Hello Again"

따옴표는 문자열을 정의하지 않으며 단지 그 사이에 나타나는 모든 문자를 이스케이프합니다.

답변3

번갈아,

myprogram "$(printf '%s\n' "Hello" "world once" "World Hello Again")"

printf 명령은 형식 문자열을 재사용하여 주어진 인수를 사용합니다. 또한 $()문법은 후행 줄 바꿈을 자동으로 제거합니다.

답변4

흥미롭게도 세 가지 답변 중 누구도 가장 간단한 해결책을 지적하지 않았습니다.

myprogram $'Hello\nWorld Hello Again'

달러 시세 이후로 (말하자면)인용의 한 형태, 전체 인수에 사용하십시오.

물론 bash에서 따옴표는 어떤 종류의 구분 기호도 아니라는 점을 아는 것이 좋습니다. 빈 공간단어 분할에 사용됩니다. 따옴표는 한 매개변수의 끝점과 다른 매개변수의 시작점을 구분하지 않습니다. 이는 단일 매개변수 내에서 참조 방법을 자유롭게 혼합할 수 있음을 의미합니다. (이 내용은 이미 이 사이트의 다른 곳에 잘 설명되어 있습니다. 찾아서 링크할 수 있는지 알아보겠습니다.)

관련 정보