bash命令在变量中的输出用撇号引起来。为什么?

时间:2018-12-20 18:25:15

标签: bash

bash noob在这里。我有一个bash命令,如果我从命令行正常执行,将返回一个ip地址:

kubectl get svc ssdl-web --namespace default -o jsonpath='{$.status.loadBalancer.ingress[0].ip}'

返回:

  

104.76.131.131

但是,如果我将命令存储在var中,然后执行它,答案会被换成撇号:

get_external_ip_cmd="kubectl get svc ssdl-web --namespace default -o jsonpath='{$.status.loadBalancer.ingress[0].ip}'" && echo $($(echo $get_external_ip_cmd))

  

'104.76.131.131'

我需要没有撇号的结果。

我敢肯定有一个简单的解释,但我不知道是什么。有人可以填写我吗?谢谢。

(我将命令存储在var中的原因是我想多次执行该命令)

1 个答案:

答案 0 :(得分:1)

替换结果仅通过字符串拆分和glob扩展进行。它们不要进行引号删除(引号被视为文字,而不是句法),因此引号将传递给您的命令,而不是由shell使用。

这在BashFAQ #50中有详细讨论。最佳实践通常是使用函数而不是字符串来存储要多次调用的代码。 (在某些情况下,数组可能更合适;有关详细信息,请阅读FAQ。)


用您的代码定义一个函数如下:

get_external_ip() {
  kubectl get svc ssdl-web \
    --namespace default \
    -o jsonpath='{$.status.loadBalancer.ingress[0].ip}'
}

然后以以下方式运行它:

get_external_ip