jq не может преобразовать строку в int в bash - PullRequest
1 голос
/ 28 марта 2019

Я работаю над созданием новой полезной нагрузки JSON для обновления Consul с расположением службы базы данных MSSQL.

Когда я звоню 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 из строки в целое число, поскольку этого требует 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 ]

3 голосов
/ 28 марта 2019

Я думаю, вы неправильно используете фильтр 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
  }
}
2 голосов
/ 28 марта 2019

Похоже, вам нужно передать число с --argjson вместо --arg:

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

Это кажется проще, чем использовать tonumber

...