jq 无法在 bash 中将字符串转换为 int



我正在努力生成一个新的JSON有效负载,以使用MSSQL数据库服务位置更新Consul。

当我这样调用jq时:

mssql_svc_ip=$(kubectl get svc/mssql-linux -o 'jsonpath={.spec.clusterIP}')
mssql_svc_port=$(kubectl get svc/mssql-linux -o 'jsonpath={.spec.ports[0].port}')
jq -n -r --arg MSSQL_IP $mssql_svc_ip --arg MSSQL_PORT $mssql_svc_port '{
    "Datacenter": "dev",
    "Node": "database",
    "Address": $MSSQL_IP,
    "Service": {
        "Service": "mssql-dev",
        "Port": $MSSQL_PORT
        }
}'

它产生正确的结构:

{
  "Datacenter": "dev",
  "Node": "database",
  "Address": "10.43.192.146",
  "Service": {
    "Service": "mssql-dev",
    "Port": "1433"
  }
}

我需要将Service.Port字段从字符串转换为整数,因为这是 Consul API 所需要的。我可以用tonumber做到这一点,就像这样:

mssql_svc_ip=$(kubectl get svc/mssql-linux -o 'jsonpath={.spec.clusterIP}')
mssql_svc_port=$(kubectl get svc/mssql-linux -o 'jsonpath={.spec.ports[0].port}')
jq -n -r --arg MSSQL_IP $mssql_svc_ip --arg MSSQL_PORT $mssql_svc_port '{
    "Datacenter": "dev",
    "Node": "database",
    "Address": $MSSQL_IP,
    "Service": {
        "Service": "mssql-dev",
        "Port": tonumber($MSSQL_PORT)
        }
}'

但是,当我尝试将$MSSQL_PORT变量转换为数字时,出现此错误:

jq: error: tonumber/1 is not defined at <top-level>, line 7:
        "Port": tonumber($MSSQL_PORT)                
jq: 1 compile error

起初我认为这是一个赋值错误,变量没有正确地作为参数传递,但我尝试了几次迭代,但我仍然得到同样的错误。我做错了什么?

我认为您滥用了tonumber过滤器。 根据文档,语法看起来像:

jq -n -r --arg MSSQL_IP "$mssql_svc_ip" --arg MSSQL_PORT "$mssql_svc_port" '{
    "Datacenter": "dev",
    "Node": "database",
    "Address": $MSSQL_IP,
    "Service": {
        "Service": "mssql-dev",
        "Port": ($MSSQL_PORT|tonumber)
        }
}'

事实上,如果$msssql_svc_ip10.43.192.146$mssql_svc_port 1433,那会得到我:

{
  "Datacenter": "dev",
  "Node": "database",
  "Address": "10.43.192.146",
  "Service": {
    "Service": "mssql-dev",
    "Port": 1433
  }
}

看起来你需要用 --argjson 而不是 --arg 传递数字:

$ jq -n -r --argjson foo 12 '{"foo":$foo}'
{
  "foo": 12
}

这似乎比使用tonumber更简单

最新更新