Comment inclure un caractère '&' dans une instruction bash curl


98

J'essaie d'utiliser curl dans bash pour télécharger une page Web, mais le &symbole dans l'URL n'est pas interprété comme un caractère comme je le voudrais. Des idées sur la façon dont je peux convaincre bash que le symbole &est juste un personnage ennuyeux et rien de spécial?


Jetez un œil au sujet suivant, cela devrait vous aider - stackoverflow.com/questions/2067969/…
morgents

J'ai essayé de remplacer le &symbole avec \&, '&', "&", ^&mais ne l' ont pas été en mesure d'obtenir l'URL d'évaluer correctement. En fait, cela '&'fonctionne lorsque j'exécute la commande curl à partir de Terminal.app, mais échoue lorsque je la place dans un script bash, l'enveloppe dans une boucle et l'exécute.
Chernoff

Réponses:


122

Mettre l'URL entière entre guillemets devrait résoudre votre problème.


9
les guillemets simples pourraient être meilleurs, sauf s'il est nécessaire de résoudre des variables.
jpm

Lorsque j'utilise des guillemets autour de l'URL entière, l'expression ${i}ne renvoie pas de valeur.
Chernoff

2
Dans mon cas, les guillemets doubles ont échoué alors que les guillemets simples fonctionnaient très bien.
abeboparebop

3
Veuillez faire attention au programme utilisé pour taper les guillemets. Alors que j'étais pressé d'éditer un script shell, j'ai utilisé un programme d'édition de texte. Il met des guillemets inclinés au lieu de guillemets doubles droits. Cela gâche vraiment le script et rend le problème difficile à trouver!
David

40
curl "http://www.example.com?m=method&args=1"

Utilisez-vous le & comme délimiteur pour une URL GET? Ou est dans un morceau de données?

S'il se trouve dans des données, vous devez l'encoder avec un caractère HTML, sinon, entouré de guillemets.

Le codage pour &devrait devenir %26dans l'URL.

curl "http://www.example.com?m=this%26that

J'utilise le &symbole comme une donnée, presque exactement comme vous l'avez montré. Le hic, c'est que, au lieu des valeurs numériques que j'utilise ${i}. Je veux donc être http://www.example.com?m=method&args=${i}évalué en tant qu'URL.
Chernoff

3
La façon dont je viens d'afficher l'URL utilise le '&' comme délimiteur pour les variables GET, donc maintenant je suis confus, dans $ [i] vous avez un élément de données qui contient '&'? Si tel est le cas, vous devrez l'encoder par URL. & =% 26
Matt Clark

1
Recherche sur tout Internet n'a pas pu trouver la solution. @MattClark vous êtes le héros. Je viens de coder l'URL et qui était un morceau de données et mon script fonctionne bien.
Haris ur Rehman

1
Y a-t-il un "manquant" à la fin du deuxième extrait de code?
David

23

Mettre des guillemets simples autour du &symbole semble fonctionner. Autrement dit, l'utilisation d'une URL comme http://www.example.com/page.asp?arg1=${i}'&'arg2=${j}avec curl renvoie la page Web demandée.


2
vous devez inclure l'exigence d'argumentation sur la question afin qu'elle soit claire pour les vues futures.
Manatax du

Pourquoi cette réponse est-elle acceptée? Cette réponse doit être acceptée stackoverflow.com/a/13339492/2898694
Sharikov Vladislav

13

Au lieu d'essayer les caractères d'échappement "&", vous pouvez spécifier les paramètres d'url http dans les requêtes POST avec le paramètre -d comme indiqué ci-dessous:

curl -X POST http://www.example.com \
-d arg1=this \
-d arg2=that

Si la requête est un GET, vous devez également ajouter l'option -G, qui indique à curl d'envoyer les données avec la requête GET.

curl -X GET -G http://www.example.com \
-d arg1=this \
-d arg2=that

C'est la meilleure réponse! THX!
déverrouiller

Cela a fonctionné pour moi. L'ajout de guillemets doubles n'a pas fonctionné.
Juhog

9

Vous pouvez utiliser à la %26place &. Le code d'entité fonctionnera correctement.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.