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?
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}' ...
É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.
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
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 sprintf
de 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