Расширить аргументы, переданные в функцию bash, содержащую кавычки

Я хочу выполнить эту команду curl с телом json. Я хочу выполнить его с помощью функции bash, такой как query_db myId myClass

function query_db(){
    curl -x socks5h://localhost:30001 -X POST https://my-db.us-east-1.es.amazonaws.com/my_db/_search?pretty -H 'Content-Type: application/json' -d '{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "eventData.clazz":   "'$2'"       }},
        { "match": { "eventData.itemId":   "'$1'"       }}
      ]
  }
}
}'
}

Однако приведенный выше запрос не выполняется, потому что $ 2 и $ 1 не раскрываются в фактические аргументы. Как исправить эту функцию?

1 ответ
1

Это действительно работает. Он просто прерывается, если аргументы содержат пробелы (и он ломается по-разному, если они содержат символы, которые являются специальными в JSON), но общее использование 'text'$var'text' правильно.

Чтобы исправить только проблему с пробелами, заключите в двойные кавычки каждое расширение переменной: (существующие двойные кавычки — это просто буквальные символы внутри строкового литерала в одинарных кавычках, поэтому они ничего не делают для расширения переменной)

' ...
    { "match": { "eventData.clazz":   "'"$2"'"       }},
    { "match": { "eventData.itemId":  "'"$1"'"       }}
... '

Но правильно Чтобы исправить все проблемы, вам нужно будет использовать какой-нибудь инструмент, который действительно понимает, как генерировать JSON, а не только обычную подстановку строк:

function query_db(){
    local json="$(jq --null-input --arg class "$2" --arg item "$1" '{
      "query": {
        "bool": {
          "must": [
            { "match": { "eventData.clazz": $class } },
            { "match": { "eventData.itemId": $item } }
          ]
        }
      }
    }')"

    curl -x socks5h://localhost:30001 -X POST https://my-db.us-east-1.es.amazonaws.com/my_db/_search?pretty -H 'Content-Type: application/json' -d "$json"
}

$class и $item теперь являются переменными jq, а не переменными bash, и будут автоматически преобразованы в строковые значения.)

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *