【问题标题】:Replace a variable in a json string with ip address in bash用bash中的ip地址替换json字符串中的变量
【发布时间】:2020-02-29 03:24:16
【问题描述】:

现在我在 bash 中有一个 JSON 字符串:

str='{"output_name":"http://HOST:33445/data/results/merged_video.mp4"}'

我从一个命令中得到了一个 IP 地址:

HOST_IP_FOR_FUNC="$(minikube ssh "route -n | grep ^0.0.0.0 | awk '{ print \$2 }'")" && echo $HOST_IP_FOR_FUNC

结果是192.168.64.1

我想用这个变量替换str中的“HOST”。

所以我用了:

z=${str//HOST/$HOST_IP_FOR_FUNC} && echo $z

只有得到

:33445/data/results/merged_video.mp4"}

但是,如果我明确地为 HOST_IP_FOR_FUNC 赋值:

ip="192.168.64.1"
z=${str//HOST/$ip} && echo $z

然后我得到了我想要的:

{"output_name":"http://192.168.64.1:33445/data/results/merged_video.mp4"}

我该如何处理?

我在 MacOS 10.15.3 上使用 zsh 或 bash

根据@Cyrus,我得到了他建议的命令的输出:

minikube ssh "route -n | grep ^0.0.0.0 | awk '{ print \$2 }'" | hexdump -C

00000000  31 39 32 2e 31 36 38 2e  36 34 2e 31 0d 0a        |192.168.64.1..|
0000000e

【问题讨论】:

  • 您的 minikube 命令中似乎有一些未转义的 " 符号。您的 HOST_IP_FOR_FUNC 没有正确填充。尝试转义,即在命令中的第二个和第三个 " 中使用 \"
  • minikube 'ssh route -n' | grep ^0.0.0.0 | awk '{ print $2 }' | hexdump -C 的输出添加到您的问题(无评论)。

标签: bash


【解决方案1】:

首先从字符串HOST_IP_FOR_FUNC中删除十六进制0d(回车):

HOST_IP_FOR_FUNC="${HOST_IP_FOR_FUNC/$'\x0d'/}"

【讨论】:

    【解决方案2】:

    看看你的变量我可以告诉你这很可能是由于你的报价。您需要转义您的内部双引号。试试这个HOST_IP_FOR_FUNC="$(minikube ssh \x22route -n | grep ^0.0.0.0 | awk '{ print \$2 }'\x22)" && echo $HOST_IP_FOR_FUNC \x22 作为双引号的十六进制。更多详情请看这篇帖子How to escape a double quote inside double quotes?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-13
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 2014-12-31
      • 2014-01-30
      相关资源
      最近更新 更多