Как установить переменную в вихревой команде в ударе?

У меня есть файл удара:

#!/bin/bash

# yesnobox.sh - An inputbox demon shell script
OUTPUT="/tmp/input.txt"

# create empty file
>$OUTPUT

# cleanup  - add a trap that will remove $OUTPUT
# if any of the signals - SIGHUP SIGINT SIGTERM it received.
trap "rm $OUTPUT; exit" SIGHUP SIGINT SIGTERM

# show an inputbox
dialog --title "Inputbox" \
--backtitle "Search vacancies" \
--inputbox "Enter your query " 8 60 2>$OUTPUT

# get respose
respose=$?

# get data stored in $OUPUT using input redirection
name=$(<$OUTPUT)

curl -d '{"query":"developer", "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/explorer

в последней строке (завихряются команда) я хочу определить имя переменной вместо этого "разработчик". Как правильно вставить его?

6
задан 31 August 2018 в 08:12

4 ответа

К переменным доступа необходимо поместить знак доллара перед именем: $name

Однако переменные не становятся расширенными в строках, включенных в 'одинарные кавычки'. Необходимо перенести их в "двойных кавычках", хотя, для предотвращения разделения слова расширенного значения, если оно могло бы содержать пробелы.

Таким образом, существует в основном два пути, мы любой поместил целый аргумент в двойные кавычки для создания переменной расширяемой, но затем мы должны выйти из символов двойной кавычки внутри, так, чтобы они закончили в фактическом параметре (сокращенная командная строка):

curl -d "{\"query\":\"$name\", \"turnOff\":true}" ...

С другой стороны, мы можем связать строковые литералы, включенные в различные типы кавычки путем записи им сразу друг рядом с другом:

curl -d '{"query":"'"$name"'", \"turnOff\":true}' ...
12
ответ дан 23 November 2019 в 07:14

@ ByteCommander ответит хорошо, предполагая, что вы знаете, что значение name является правильно экранированным строковым литералом JSON. Если вы не можете (или не хотите) делать такое предположение, используйте инструмент, подобный jq, чтобы сгенерировать JSON для вас.

curl -d "$(jq -n --arg n "$name" '{query: $n, turnOff: true}')" \
     -H "Content-Type: application/json" -X POST http://localhost:8080/explorer
6
ответ дан 23 November 2019 в 07:14

Начиная со значения для завихрений -d параметр в средствах одинарных кавычек, что не будет никакого расширения параметра, просто добавив, что переменная не работала бы. Можно обойти это путем окончания строкового литерала, добавления переменной и затем запуска строкового литерала снова:

curl -d '{"query":"'"$name"'", "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/explorer

Дополнительные двойные кавычки вокруг переменной используются для предотвращения нежелательного расширения параметра оболочки.

7
ответ дан 23 November 2019 в 07:14

Некоторые могли бы найти это более читаемым и удобным в сопровождении, так как это избегает использования выхода и последовательностей одинарных и двойных кавычек, за которыми трудно следовать и соответствовать.

Используйте эквивалент Bash sprintf обрабатывать замену по шаблону:

printf -v data '{"query":"%s", "turnOff":true}' "developer"

curl -d "$data" -H "Content-Type: application/json" -X POST http://localhost:8080/explorer
3
ответ дан 23 November 2019 в 07:14

Другие вопросы по тегам:

Похожие вопросы: