Рейтинг:7

Переменная Bash в 2 кавычках

флаг pl

Я хочу отправить такой запрос с помощью завиток:

свернуть некоторые параметры и заголовки --data-binary '{"secret":"$1"}'

но $1 не является переменным. я пытался использовать эхо с помощью этой команды:

эхо '{"asd":"$1"}' dhkdgb

и я получил этот вывод:

{"asd":"$1"} dhkdgb

Однако я хочу получить этот вывод:

{"асд":"дхкдгб"}

И в завиток запрос, я хочу отправить это:

свернуть некоторые параметры и заголовки --data-binary '{"secret":"argv 0 скрипта"}'

Как я могу решить эту проблему?

флаг ar
$1 — это переменная, содержащая первый аргумент вашего скрипта... но вы же не используете скрипт, верно? Вы просто вводите команду curl в командной строке? Итак, $1 пуст/не установлен. Кроме того, переменные внутри одинарных кавычек не интерпретируются. Вы должны использовать одинарные кавычки, если хотите использовать «$ 1» буквально, без того, чтобы Bash интерпретировал его как переменную.
флаг ar
Если вы вызываете это из скрипта и `$1` действительно определено, то замените ваши одинарные кавычки двойными кавычками, а ваши двойные кавычки либо одинарными, либо экранированными двойными кавычками. Замените `'{"secret":"$1"}'` на `"{\"secret\":\"$1\"}"` или на `"{'secret':'$1'}"`
флаг in
@mivk Официальная спецификация JSON на самом деле требует двойных кавычек для строк (как в ключах, так и в значениях), поэтому для правильной переносимости вам придется использовать экранированные двойные кавычки вместо подхода с одинарными кавычками.
Рейтинг:11
флаг hr

Есть несколько способов сделать это напр. данный

$ set -- 'фу-бар'

(чтобы присвоить значение фу бар к первому позиционному параметру оболочки, как если бы в сценарии, вызываемом как myscript "фу бар") тогда например

$ эхо '{"asd:":"'"$1"'"}'
{"asd:":"foo bar"}

или же

$ эхо {\"asd:\":\""$1"\"}
{"asd:":"foo bar"}

Однако вам может показаться чище использовать оболочку printf встроенный для создания форматированной строки, которую вы можете назначить новой переменной:

$ printf -v данные '{"asd": "%s"}' "$1"
$ эхо "$ данные"
{"asd": "фу-бар"}

который вы затем можете использовать как

curl некоторые параметры и заголовки --data-binary "$data"

В качестве альтернативы, поскольку вы, похоже, пытаетесь передать объект JSON команде curl, вы можете рассмотреть возможность использования jq на месте printf:

$ jq -nc --arg x "$1" '{asd: $x}'
{"asd":"foo bar"}

или аналогичным образом с помощью встроенного $ARGS множество

$ jq -nc --arg asd "$1" '$ARGS.named'
{"asd":"foo bar"}

если вы хотите передать конструктору и имя, и значение.

muru avatar
флаг us
У `jq` есть более приятный способ сделать это: `jq -n --arg asd "$1" '.$ARGS.named'`
vanadium avatar
флаг cn
Если я что-то не упустил, я думаю, что это гораздо проще решить - см. мой ответ.
флаг hr
@vanadium - конечно, как я уже упоминал, есть несколько способов сделать это с помощью esacpes. Я просто не являюсь поклонником "наклонных зубочисток", поэтому попытался предложить некоторые альтернативы.
флаг hr
@muru приятно - спасибо. Добавлен.
Рейтинг:0
флаг in

Я склонен использовать здесьдок и -д@- (чтение входных данных из стандартного ввода) для составления тела запроса JSON:

кошка <<ЕОФ |
{
    "секрет": "$ СЕКРЕТ"
}
EOF
завиток ... \
    -X ПОСТ \
    -H "Тип контента: приложение/json" \
    "${BASE_URL%%/}/путь/" -d@-

Да, синтаксис немного странный.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.