2017-05-31 5 views
0

Le but de mon script est d'envoyer un message au serveur le plus proche. Je CURL de le faire:Comment puis-je exécuter une commande qui a une combinaison de guillemets et de guillemets doubles?

#!/bin/bash 
message="This is my message with potentially several quotes in it ..." 
url=http://www.myMatterMostServer.com/hooks/myMattermostKey 
payload="{ \"text\" : \"$message\" }" 
curlCommand="curl --insecure --silent --show-error --header 'Content-Type: application/json' -X POST --data '"$payload"' "$url 
echo -e $curlCommand 
$curlCommand 

La commande echo montre quelque chose qui est exécutable si je copie et l'exécuter directement dans un terminal.

Mais la dernière ligne ne correctement et je dois exécuter pas dans la console:

++ curl --insecure --silent --show-error --header ''\''Content-Type:' 'application/json'\''' -X POST --data ''\''{' '"text"' : '"This' is my message with potentially several quotes in it '..."' '}'\''' http://poclo7.sii24.pole-emploi.intra/hooks/iht8rz8uwf81fgoq9ser8tda3y 
curl: (6) Couldn't resolve host 'application' 
curl: (6) Couldn't resolve host '"text"' 
curl: (6) Couldn't resolve host ':' 
curl: (6) Couldn't resolve host '"This' 
curl: (6) Couldn't resolve host 'is' 
curl: (6) Couldn't resolve host 'my' 
curl: (6) Couldn't resolve host 'message' 
curl: (6) Couldn't resolve host 'with' 
curl: (6) Couldn't resolve host 'potentially' 
curl: (6) Couldn't resolve host 'several' 
curl: (6) Couldn't resolve host 'quotes' 
curl: (6) Couldn't resolve host 'in' 
curl: (6) Couldn't resolve host 'it' 
curl: (6) Couldn't resolve host '..."' 

J'ai essayé tellement de combinaisons de citations, entre guillemets et $ (commande) ... S'il vous plaît aidez-moi: -)

+0

pourrait être utile de mettre votre charge utile tout dans un fichier et dire curl pour lire le fichier pour les données. https://stackoverflow.com/questions/3007253/send-post-xml-file-using-curl-command-line https://stackoverflow.com/questions/6408904/send-post-request-with-data-specified -in-file-via-curl – GregHNZ

Répondre

1

Les variables sont pour les données, pas pour le code. Voir Bash FAQ 50. Définir une fonction à la place.

curlCommand() { 
    message=$1 
    url=$2 
    payload='{"text": "$message"}' 
    curl --insecure --silent --show-error \ 
     --header 'Content-Type: application/json' \ 
     -X POST --data "$payload" "$url" 
} 

curlCommand "This is my message with potentially several quotes in it ..." http://www.myMatterMostServer.com/hooks/myMattermostKey 

Pensez à utiliser jq pour générer la charge utile pour garantir que le contenu de $message sont correctement saisies.

payload=$(jq --arg msg "$message" '{text: $msg}') 

ou redirigez la sortie de jq directement à curl:

jq --arg msg "$message" '{text: $msg}' | curl ... --data @- ... 
+0

merci pour votre réponse mais je n'ai pas jq à ma disposition ... – OphyTe

+0

Vous pouvez utiliser n'importe quelle langue qui fournit une bibliothèque JSON; le fait est que vous ne devriez pas essayer de générer manuellement JSON via une interpolation de variable. – chepner

+0

J'ai finalement réussi à le faire fonctionner avec la 6ème méthode de la [Bash FAQ] (http://mywiki.wooledge.org/BashFAQ/050) (vraiment de bonnes choses en passant). J'ai aussi eu un petit problème CR/LF que [ce post] (https://stackoverflow.com/a/38912470/2145671) m'a aidé à résoudre. Merci encore @chepner – OphyTe