Bash

printf 的輸出與 FORMAT 參數中指定的不同

  • April 5, 2020

我有點困惑,輸出與參數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_HASH我有來自docker exec -t. TTY顯然,由CRLF( )使用的行尾\r\n,因此出乎意料\r

您的變數在字元串末尾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

引用自:https://unix.stackexchange.com/questions/578059