我正在生成一个新的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
起初,我认为这是一个赋值错误,并且变量没有作为参数正确传递,但是我尝试了几次迭代,但仍然遇到相同的错误。我在做什么错?
答案 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_ip
是10.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