Обновление: используйте более простой
request_body=$(cat <<EOF
{
"jsonrpc": "2.0",
"method": "Player.Open",
"params": {
"item": {
"file": "$FILENAME"
}
}
}
EOF
)
, а не то, что я объясню ниже. Однако, если это опция, используйте jq
для создания JSON. Это гарантирует, что значение $FILENAME
будет правильно процитировано.
request_body=$(jq -n --arg fname "$FILENAME" '
{
jsonrpc: "2.0",
method: "Player.Open",
params: {item: {file: $fname}}
}'
. Сначала было бы проще определить переменную с содержимым тела запроса:
#!/bin/bash
header="Content-Type: application/json"
FILENAME="/media/file.avi"
request_body=$(< <(cat <<EOF
{
"jsonrpc": "2.0",
"method": "Player.Open",
"params": {
"item": {
"file": "$FILENAME"
}
}
}
EOF
))
curl -i -X POST -H "$header" -d "$request_body" http://192.167.0.13/jsonrpc
Это определение может потребовать объяснение для понимания, но обратите внимание на два больших преимущества: $( < ... ) # bash improvement over $( cat ... )
Вместо имени файла, однако, вы указываете подстановку процесса, в которой вывод команды используется так, как если бы она была телом файла. Команда в подстановке процесса - это просто cat
, которая читается из документа здесь. Это документ, который содержит ваш запрос.