首页 > 解决方案 > 变量中 bash 命令的输出包含在撇号中。为什么?

问题描述

在这里抨击菜鸟。我有一个 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 中的原因是我想多次执行它)

标签: bash

解决方案


替换结果仅通过字符串拆分和全局扩展。它们不会删除引号(引号被视为文字,而不是句法),因此引号被传递给您的命令,而不是被 shell 消耗。

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


使用您的代码定义函数如下所示:

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

然后运行它:

get_external_ip

推荐阅读