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_ended\": \"${TIME_ENDED}\", \"state\": ${FAILED}, \"error\": \"${OUT}\" }"
    エコー "${JSON}"    
    終了 ${TRUE}
フィ

結果は次のようになります:

[root@内部 ~]# ./backup -H 17.17.0.111
" }time_started": "1394889912", "time_ended": "1394889913", "state": 1, "error": "アクセスが拒否されました (公開鍵、パスワード、キーボードインタラクティブ)。
[ルート@内部]#

最終出力用に JSON をきれいに印刷するために node.js CLI ユーティリティを使用していますが、シェルから無効な JSON を取得するため失敗します。これを修正するにはどうすればよいでしょうか?

PS: JSON をフォーマットするライブラリはたくさんあることは知っていますが、私はこの方法で行う必要があるので、ここでは説明しません。

答え1

ssh 出力で復帰文字が取り込まれているようです。次を試してください:

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

説明: これは:

${OUT%$'\r'}

末尾に CR 文字がある場合はそれをカットします...

関連情報