![Bash 命令替换和变量问题](https://linux22.com/image/1401539/Bash%20%E5%91%BD%E4%BB%A4%E6%9B%BF%E6%8D%A2%E5%92%8C%E5%8F%98%E9%87%8F%E9%97%AE%E9%A2%98.png)
我正在用 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 字符(如果有)...