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

时间:2019-03-28 18:08:58

标签: bash jq

我正在生成一个新的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

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

2 个答案:

答案 0 :(得分:3)

我认为您在滥用tonumber过滤器。基于the documentation,语法看起来像是:

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
  }
}

答案 1 :(得分:2)

好像您需要用--argjson而不是--arg传递数字:

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

这似乎比使用tonumber

简单