我正在努力生成一个新的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_ip
是10.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
更简单