printf의 출력이 FORMAT 인수에 지정된 것과 다릅니다.

printf의 출력이 FORMAT 인수에 지정된 것과 다릅니다.

약간 혼란스럽습니다. 의 출력이 인수 printf에 지정된 것과 다릅니다 FORMAT.

$ echo "$PWD_HASH"
{SHA512-CRYPT}$6$ZLgRL2DZSKYUCzht$PaTcpkoOi6P6p9ItIjRTL00MCB/8IU.fJbGk9EO/LxUAgZwGASO6qXNSNSzxQRBGjNiPpiArgwOacZSG5A6FL1
$ PWD_JSON=$(printf '{"password": "%s"}' "$PWD_HASH")
$ echo "$PWD_JSON" 
"}password": "{SHA512-CRYPT}$6$ZLgRL2DZSKYUCzht$PaTcpkoOi6P6p9ItIjRTL00MCB/8IU.fJbGk9EO/LxUAgZwGASO6qXNSNSzxQRBGjNiPpiArgwOacZSG5A6FL1

어떻게 왜? 원하는 출력을 얻는 방법은 무엇입니까?

변수에서가 아니라 문자열을 직접 전달하면 예상되는 출력을 얻습니다.

$ PWD_JSON=$(printf '{"password": "%s"}' '{SHA512-CRYPT}$6$ZLgRL2DZSKYUCzht$PaTcpkoOi6P6p9ItIjRTL00MCB/8IU.fJbGk9EO/LxUAgZwGASO6qXNSNSzxQRBGjNiPpiArgwOacZSG5A6FL1')
$ echo "$PWD_JSON"
{"password": "{SHA512-CRYPT}$6$ZLgRL2DZSKYUCzht$PaTcpkoOi6P6p9ItIjRTL00MCB/8IU.fJbGk9EO/LxUAgZwGASO6qXNSNSzxQRBGjNiPpiArgwOacZSG5A6FL1"}

허용되는 답변을 보완하기 위해 여기 PWD_HASHdocker exec -t. 분명히 에서 사용하는 줄 끝은 TTY( CRLF) \r\n이므로 예상치 못한 결과가 발생합니다 \r.

답변1

변수에는 문자열 끝에 마지막 두 문자를 출력 시작 부분으로 이동하는 PWD_HASH캐리지 리턴이 포함되어 있습니다 .\r"}

예:

$ PWD_HASH='{SHA512-CRYPT}abcde'$'\r'
$ PWD_JSON=$(printf '{"password": "%s"}' "$PWD_HASH")
$ echo "$PWD_HASH"
{SHA512-CRYPT}abcde
$ echo "$PWD_JSON"
"}password": "{SHA512-CRYPT}abcde
$ echo "$PWD_JSON" | od -c
0000000   {   "   p   a   s   s   w   o   r   d   "   :       "   {   S
0000020   H   A   5   1   2   -   C   R   Y   P   T   }   a   b   c   d
0000040   e  \r   "   }  \n
0000045

관련 정보