web-dev-qa-db-fra.com

Comment définir une variable dans la commande curl dans bash?

J'ai un fichier bash:

#!/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

dans la dernière chaîne (curl commande) Je veux définir la variable nom à la place "développeur". Comment l'insérer correctement?

4
Valentyn Hruzytskyi

Pour accéder aux variables, vous devez mettre un signe dollar devant le nom: $name

Cependant, les variables ne sont pas développées à l'intérieur de chaînes entre guillemets simples. Cependant, vous devriez les avoir entourés de "guillemets doubles" pour empêcher le fractionnement de la valeur développée par Word, si celle-ci contient des espaces.

Donc, il y a essentiellement deux manières, soit de mettre l'argument entier entre guillemets pour rendre la variable extensible, mais nous devons ensuite échapper les caractères de guillemets à l'intérieur, de sorte qu'ils se retrouvent dans le paramètre réel (ligne de commande raccourcie):

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

Alternativement, nous pouvons concaténer les littéraux de chaîne inclus dans différents types de devis en les écrivant immédiatement l'un à côté de l'autre:

curl -d '{"query":"'"$name"'", \"turnOff\":true}' ...
11
Byte Commander

Étant donné que la valeur du paramètre curls -d se situe entre guillemets simples, cela signifie qu’il n’y aura pas de développement de paramètre, il suffit d’ajouter la variable ne fonctionnerait pas . Vous pouvez contourner ce problème en terminant le littéral de chaîne, en ajoutant la variable puis en redémarrant le littéral de chaîne:

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

Les caractères supplémentaires guillemets autour de la variable sont utilisés pour empêcher une expansion indésirable des paramètres Shell.

7
mgor

La réponse de @ ByteCommander est bonne, en supposant vous savez que la valeur de name est un littéral de chaîne JSON correctement échappé. Si vous ne pouvez pas (ou ne voulez pas) faire cette hypothèse, utilisez un outil tel que jq pour générer le JSON pour vous.

curl -d "$(jq -n --arg n "$name" '{query: $n, turnOff: true}')" \
     -H "Content-Type: application/json" -X POST http://localhost:8080/Explorer
6
chepner

Certains trouveront peut-être cela plus lisible et facile à gérer, car cela évite d'utiliser des séquences d'échappement, ainsi que des séquences de guillemets simples et doubles, difficiles à suivre et à faire correspondre.

Utilisez l'équivalent de sprintfde Bash pour modéliser la substitution:

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

curl -d "$data" -H "Content-Type: application/json" -X POST http://localhost:8080/Explorer
3
Dennis Williamson