У меня есть файл удара:
#!/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
в последней строке (завихряются команда) я хочу определить имя переменной вместо этого "разработчик". Как правильно вставить его?
К переменным доступа необходимо поместить знак доллара перед именем: $name
Однако переменные не становятся расширенными в строках, включенных в 'одинарные кавычки'. Необходимо перенести их в "двойных кавычках", хотя, для предотвращения разделения слова расширенного значения, если оно могло бы содержать пробелы.
Таким образом, существует в основном два пути, мы любой поместил целый аргумент в двойные кавычки для создания переменной расширяемой, но затем мы должны выйти из символов двойной кавычки внутри, так, чтобы они закончили в фактическом параметре (сокращенная командная строка):
curl -d "{\"query\":\"$name\", \"turnOff\":true}" ...
С другой стороны, мы можем связать строковые литералы, включенные в различные типы кавычки путем записи им сразу друг рядом с другом:
curl -d '{"query":"'"$name"'", \"turnOff\":true}' ...
@ 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
Начиная со значения для завихрений -d
параметр в средствах одинарных кавычек, что не будет никакого расширения параметра, просто добавив, что переменная не работала бы. Можно обойти это путем окончания строкового литерала, добавления переменной и затем запуска строкового литерала снова:
curl -d '{"query":"'"$name"'", "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/explorer
Дополнительные двойные кавычки вокруг переменной используются для предотвращения нежелательного расширения параметра оболочки.
Некоторые могли бы найти это более читаемым и удобным в сопровождении, так как это избегает использования выхода и последовательностей одинарных и двойных кавычек, за которыми трудно следовать и соответствовать.
Используйте эквивалент Bash sprintf
обрабатывать замену по шаблону:
printf -v data '{"query":"%s", "turnOff":true}' "developer"
curl -d "$data" -H "Content-Type: application/json" -X POST http://localhost:8080/explorer