Bash 命令替換和變數問題

Bash 命令替換和變數問題

我正在 bash 中編寫一些簡單的備份實用程序,任何輸出都必須採用 JSON 格式。

我正在檢查主機的可及性,如果發生任何錯誤,我想將其列印出來。但是,我的輸出有問題:

失敗=1
TIME_STARTED=$(日期 +%s)
OUT="$( ${SSH} ${SSH_ARGS} ${HOST} 'true' 2>&1 >/dev/null)"

如果 [[ $? != 0 && ! -z "${OUT}" ]];然後

    TIME_ENDED=$(日期 +%s)
    JSON="{ \"time_started\": \"${TIME_STARTED}\", \"time_ending\": \"${TIME_ENDED}\", \"state\": ${FAILED}, \"error\" : \"${OUT}\" }"
    回顯“${JSON}”    
    退出${TRUE}

結果是:

[root@internal ~]# ./backup -H 17.17.0.111
“ }time_started”:“1394889912”,“time_ending”:“1394889913”,“state”:1,“error”:“權限被拒絕(公鑰、密碼、鍵盤互動)。
[根@內部]#

我正在使用一些 node.js CLI 實用程式來漂亮地列印 JSON 以進行最終輸出,但它失敗了,因為它從 shell 獲取了無效的 JSON。我該如何解決這個問題?

PS:我知道有很多函式庫可以格式化 JSON,但我需要這樣做,我不想在這裡討論它。

答案1

在我看來,ssh 輸出正在拾取回車符。嘗試:

JSON="{ \"time_started\": \"${TIME_STARTED}\", \"time_ended\": \"${TIME_ENDED}\", \"state\": ${FAILED}, \"error\": \"${OUT%$'\r'}\" }"

解釋:這個:

${OUT%$'\r'}

剪切尾隨 CR 字元(如果有)...

相關內容