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@internal ~]# ./backup -H 17.17.0.111
“}time_started”:“1394889912”,“time_ended”:“1394889913”,“state”:1,“error”:“权限被拒绝(公钥,密码,键盘交互)。
[root@internal]#

我正在使用一些 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 字符(如果有)...

相关内容