我正在嘗試創建一個 JSON 資料并將其存盤到一個檔案中,然后將其提供給我要進行的 API 呼叫。但是,在格式化我的 echo 命令的輸出以生成 JSON 格式時,變數會導致回傳的輸出混亂。下面是我的腳本
cat "${SETTINGS_LIST}" | while read endpoint
do
echo "{\"id\": \"$n\", \"method\": GET, \"url\": \"$endpoint\"}"
let n=n 1
done
那么這是 SETTING_LIST 變數的內容
/accounting-rules
/aging-buckets
/application-rules
/audit-trail-settings
/batch-aliases
/billing-cycle-types
/billing-list-price-bases
/billing-period-starts
/billing-periods
/billing-rules
輸出是這樣回傳的:
"}id":"0","method":"GET","url":"/accounting-rules
"}id":"1","method":"GET","url":"/aging-buckets
"}id":"2","method":"GET","url":"/application-rules
"}id":"3","method":"GET","url":"/audit-trail-settings
"}id":"4","method":"GET","url":"/batch-aliases
"}id":"5","method":"GET","url":"/billing-cycle-types
"}id":"6","method":"GET","url":"/billing-list-price-bases
"}id":"7","method":"GET","url":"/billing-period-starts
"}id":"8","method":"GET","url":"/billing-periods
"}id":"9","method":"GET","url":"/billing-rules
例如,當我洗掉端點變數并將其更改為此時
echo "{\"id\": \"$n\", \"method\": GET, \"url\": \"/application-rules\"}"
我得到了預期的輸出
{"id": "0", "method": GET, "url": "/application-rules"}
{"id": "1", "method": GET, "url": "/application-rules"}
{"id": "2", "method": GET, "url": "/application-rules"}
{"id": "3", "method": GET, "url": "/application-rules"}
{"id": "4", "method": GET, "url": "/application-rules"}
{"id": "5", "method": GET, "url": "/application-rules"}
{"id": "6", "method": GET, "url": "/application-rules"}
{"id": "7", "method": GET, "url": "/application-rules"}
{"id": "8", "method": GET, "url": "/application-rules"}
{"id": "9", "method": GET, "url": "/application-rules"}
我做過的動作:
- 降級到舊的 git bash 版本
- 在我的 Ubuntu WSL 中嘗試過,但仍然出現相同的錯誤。
- 嘗試使用 JQ 和 printf 命令將輸出格式化為 JSON 的不同方式,但問題仍然存在
- 該腳本在具有相同版本的 BASH 和 GIT BASH 的不同機器上運行良好
有沒有人知道這個問題的原因以及如何解決?
uj5u.com熱心網友回復:
歡迎來到關于 Unix 和 Windows 如何不同地看待行尾的歷史小課!
在 Unix(和 Linux、Ubuntu 等)上,行尾定義為單個\n字符。
在 Windows 上,它是一個兩個字符的序列\r\n。
(為了完整起見,在舊的 Mac 上它是一個單一的\r,但這在今天幾乎無關緊要。)
您有一個可愛的、與 Windows 兼容的文本檔案,其中的行以\r\n. 但是,作為 Unix 工具,Bash 沒有\r特殊處理,僅在\n字符處拆分行。
因此,$endpoint變數的每個實體最后都包含一個\r。
現在,\r也稱為“回車”,來自舊打字機,這正是 Bash 的輸出例程所做的,當它遇到\r: 跳回當前行的開頭并將所有字符替換為后面的字符時。這就是為什么您會看到如此奇怪、亂碼的輸出。
修復:洗掉\r之前使用變數。例如,這個問題的答案提出了這樣的解決方案:
cat "${SETTINGS_LIST}" | while IFS= read -r endpoint
do
endpoint="${endpoint%$'\r'}"
echo "{\"id\": \"$n\", \"method\": GET, \"url\": \"$endpoint\"}"
let n=n 1
done
uj5u.com熱心網友回復:
您的設定串列中顯然有回車符。替換cat "${SETTINGS_LIST}"為dos2unix < "${SETTINGS_LIST}",即
dos2unix <"${SETTINGS_LIST}"` | while read endpoint
如果您還dos2unix沒有(我不記得它是否隨 Mac 一起提供),請從 Appstore 安裝它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/327046.html
