Как поместить параметр оболочки в строку внутри строки?

Есть параметр $ 1. Это адрес электронной почты. Я хочу, чтобы он был частью строки в строке этой команды curl:

curl 'xy.com' --data-binary '{"email":"variableValueHere!!!"}'

Итак, команда, включающая параметр$1 должна привести к этой команде ...

curl 'xy.com' --data-binary '{"email":"[email protected]"}'

если$1 равно[email protected] .

Как я могу его туда положить? Что я пробовал до сих пор:

curl 'xy.com' --data-binary '{"email":"$1"}'
curl 'xy.com' --data-binary '{"email":"`echo $1`"}'
# parameters
Источник
Codelisting
за 2 против
Лучший ответ

Попробуй это:

curl 'xy.com' --data-binary '{"email":"'"$1"'"}'

Это конкатенация

  • '{"email":"'
  • "$1"
  • '"}'

и вставляет ваш параметр в виде строки в кавычках.

за 2 против

Лучше используйте правильный парсер JSON, напримерjq :

curl 'xy.com' --data-binary "$(
  jq \
    --arg email "$1" \
    --null-input \
    --compact-output \
    '.email = $email'
)"
  • "$(jq ...)" : Захватывает выводjq в виде строки.
  • jq : Это JSON-процессор командной строки.
    • --arg email "$1" : Передать аргумент оболочки$1 ценность какjq Переменная$email .
    • --null-input : Говоритjq нет входного потока JSON для синтаксического анализа.
    • --compact-output : Говоритjq чтобы сжать его вывод, поместив каждый объект JSON в одну строку.
    • '.email = $email' : Этоjq запрос на присвоение значения$email переменная как строковое значение JSONemail ключ от корневого объекта JSON. .

Это также можно записать более компактно:

curl 'xy.com' --data-binary "$(jq -cn --arg e "$1" '.email=$e')"
за 0 против

Как насчет

curl xy.com --data-binary "{email:$1}"

?

Если вы хотите, чтобы третий аргумент был в формате JSON, напишите его как:

curl xy.com --data-binary  '{"email":"'"$1"'"}'

Вы можете упростить это до

curl xy.com --data-binary  '{"email":"'$1'"}'

если вы уверены, что ваш адрес электронной почты ($1 ) не содержит пробелов и других проблемных символов.

Если вы действительно хотите передать дополнительные одинарные кавычки для curl (как вы указали в своем комментарии), просто добавьте к своему аргументу a

"'"
  • 0
    Тогда сервер не сможет проанализировать JSON, потому что это недействительный JSON.
  • 0
    Как ваш вопрос связан с JSON? Я не вижу упоминания JSON в вашем тексте. Пожалуйста, измените свое сообщение и добавьте тег json , если есть какая-либо проблема с json.
  • 0
    Также было бы полезно, если бы вы могли указать, какую именно строку curl должен получить в качестве третьего параметра.
  • 0
    Строка содержит JSON-объект. {"email":"[email protected]"} - это JSON. Это объект с атрибутом «электронная почта» и значением «[email protected]».
  • 0
    $ 1 - это адрес электронной почты, например [email protected], и после замены $ 1 на адрес электронной почты команда curl должна выглядеть так: curl 'xy.com' --data-binary '{"email":"[email protected]"}'
  • 0
    Таким образом, сервер примет запрос только в том случае, если содержимое после --data-binary находится в пределах ' and ' а атрибут и само электронное письмо должны находиться в пределах " and " .
  • 0
    Пожалуйста, обновите свой вопрос этой информацией. Кстати: вы говорите, что сервер (какой сервер? Вы просто передаете информацию в curl) требует дополнительных одинарных кавычек вокруг третьего аргумента команды. Если это действительно так (я так не думаю), вам также необходимо указать это в своем вопросе. В идеале вы должны указать для каждого из трех аргументов, какие именно строки вы хотите передать в curl. То, что сейчас происходит, просто сбивает с толку.
  • 0
    Он дает ответ на то, что прокомментировал ndsvw. Как я уже сказал, он должен поместить эту информацию в пост, а не как комментарий.
  • 0
    Просто для пояснения, дополнительные одинарные кавычки вокруг строки json не являются требованием json, они необходимы для того, чтобы bash успешно передавал такие символы, как { и " и : без их интерпретации. Повторение одинарных кавычек в этих ответах просто помочь bash разобрать команду должным образом.
  • 0
    Если у вас нет доступного jq curl xy.com --data-binary "$(printf '{"email":"%s"}' "$1")" с той же проблемой, что и ваше решение, потому что оно не гарантирует, что "$ 1" будет заменен на правильную строку JSON.
за 0 против

Что вы видите, когда пробуете это:

curl 'xy.com' --data-binary '{"email":"`$1`"}'
  • 0
    Сервер получает адрес электронной почты ' $1 ' (stackoverflow анализирует мой текстовый ввод здесь)
  • 0
    ? Странный? Просто для подтверждения: в своем ответе я использовал обратные кавычки (а не одинарные кавычки), вы тоже использовали обратные кавычки?
  • 0
    @Dominique: Вы случайно поместили $1 в обратные кавычки!
  • 0
    Это не случайно: в этом вся идея! Обратные кавычки используются не только StackOverflow для редактирования, но и UNIX в целях оценки.
  • 0
    Да, но вы, конечно же, не хотите выполнять $ 1 как команду !!!
  • 0
    @ user1934428 Ой, ты прав. Ваш ответ кажется намного лучше (и проще).
Codelisting
Популярные категории
На заметку программисту