"ANSI-C" 방식으로 변수에서 개행 문자를 전달하는 방법은 무엇입니까?

"ANSI-C" 방식으로 변수에서 개행 문자를 전달하는 방법은 무엇입니까?

이 코드를 실행하면

#!/bin/bash

set -x

http --json http://example.com \
    value=$'hello\r\n\r\nworld'

stdout에 캐리지 리턴이 두 개 있습니다.value

http --json http://example.com 'value=hello

world'

그러나 value변수에 문자열이 있으면 표준 출력에서 ​​동일한 문자열을 얻는 방법을 찾을 수 없습니다. 예를 들어, 내가 실행하면

#!/bin/bash

set -x

variable="hello\r\n\r\nworld"

http --json http://example.com \
    value=$''"$variable"''

줄 바꿈은 없지만 \r\n\r\n문자는 없습니다.

http --json http://example.com 'value=hello\r\n\r\nworld'

변수 내부의 값에서 시작하는 줄을 묶는 방법은 무엇입니까?

변경할 수는 없지만 variable="hello\r\n\r\nworld"실행 중인 명령과 코드 사이에 코드를 추가할 수는 있습니다.

답변1

그게 나한테는 다야

#!/bin/bash

set -x

variable="hello\r\n\r\nworld"

http --json http://example.com \
    value="${variable@E}"

답변2

$'...'또는 다음과 같은 변수 할당에 사용하세요 .

variable=$'hello\r\n\r\nworld'

바꾸다

variable="hello\r\n\r\nworld"

또는 printf이스케이프 문자를 처리하는 경우(모든 POSIXy 셸에서 작동해야 함):

escaped="hello\r\n\r\nworld"
raw=$(printf "%b" "$escaped")

그러나 명령 대체는 마지막 개행 문자(있는 경우)를 사용하므로 끝에 더미 문자를 추가하고 제거하여 이 문제를 해결해야 할 수도 있습니다.

escaped="hello world\n"
raw=$(printf "%b." "$escaped")
raw=${raw%.}

그런 다음 평소와 같이 결과 변수를 사용하십시오.

관련 정보