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?

Chernoff
la source
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.

mjuarez
la source
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
Matt Clark
la source
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.

Chernoff
la source
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
noego
la source
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.

Seralto
la source
0

Utilisez le paramètre --urlavec des guillemets doubles a fonctionné pour moi

Shehan Weerasooriya
la source