Cómo incluir un carácter '&' en una declaración bash curl

98

Estoy tratando de usar curl en bash para descargar una página web, pero el &símbolo en la URL no se interpreta como un carácter como me gustaría. ¿Alguna idea sobre cómo puedo convencer a bash de que el símbolo &es solo un personaje aburrido y nada especial?

Chernoff
fuente
Eche un vistazo al siguiente tema que debería ayudarlo - stackoverflow.com/questions/2067969/…
morgents
He intentado sustituir el &símbolo con \&, '&', "&", ^&pero no han sido capaces de obtener la URL para evaluar correctamente. En realidad, '&'funciona cuando ejecuto el comando curl desde Terminal.app, pero falla cuando lo coloco en un script bash, lo envuelvo en un bucle y lo ejecuto.
Chernoff

Respuestas:

122

Poner la URL completa entre comillas dobles debería solucionar su problema.

mjuarez
fuente
9
las comillas simples pueden ser mejores, a menos que sea necesario resolver variables.
jpm
Cuando utilizo comillas en toda la URL, la expresión ${i}no devuelve un valor.
Chernoff
2
En mi caso, las comillas dobles fallaron mientras que las comillas simples funcionaron bien.
abeboparebop
3
Tenga cuidado con el programa que se utiliza para escribir las comillas. Mientras tenía prisa por editar un script de shell, usé un programa de edición de texto. Puso comillas inclinadas en lugar de comillas dobles rectas. ¡Esto realmente estropea el guión y hace que el problema sea difícil de encontrar!
David
40
curl "http://www.example.com?m=method&args=1"

¿Está utilizando & como delimitador para una URL GET? ¿O está en un dato?

Si está en datos, debe codificarlo en un carácter HTML, si no, entre comillas.

La codificación para &debería estar %26en la URL.

curl "http://www.example.com?m=this%26that
Matt Clark
fuente
Estoy usando el &símbolo como un dato, casi exactamente como lo ha mostrado. El problema es que, en lugar de valores numéricos, estoy usando ${i}. Entonces quiero llegar http://www.example.com?m=method&args=${i}a evaluar como una URL.
Chernoff
3
La forma en que acabo de mostrar la URL usa '&' como un delimitador para las variables GET, así que ahora estoy confundido, en $ [i] tienes un dato que contiene '&'? Si ese es el caso, deberá codificarlo en URL. & =% 26
Matt Clark
1
Busqué en todo Internet no pudo encontrar la solución. @MattClark eres el héroe. Acabo de codificar la URL y que era un dato y mi script funciona bien.
Haris ur Rehman
1
¿Falta un "al final del segundo fragmento de código?
David
23

Poner comillas simples alrededor del &símbolo parece funcionar. Es decir, usar una URL como http://www.example.com/page.asp?arg1=${i}'&'arg2=${j}curl devuelve la página web solicitada.

Chernoff
fuente
2
debe incluir el requisito del argumento en la pregunta para que quede claro para futuras vistas.
Manatax
¿Por qué se acepta esta respuesta? Esta respuesta debe ser aceptada stackoverflow.com/a/13339492/2898694
Sharikov Vladislav
13

En lugar de probar los caracteres de escape "&", puede especificar parámetros de URL http en solicitudes POST con el parámetro -d como se muestra a continuación:

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

Si la solicitud es GET, también debe agregar la opción -G, que le dice a curl que envíe los datos con la solicitud GET.

curl -X GET -G http://www.example.com \
-d arg1=this \
-d arg2=that
noego
fuente
¡Esta es la mejor respuesta! ¡Gracias!
inicio el
Esto funcionó para mí. Agregar comillas dobles no funcionó.
Juhog
9

Puede utilizar %26en su lugar &. El código de entidad funcionará bien.

Seralto
fuente
0

Usar el parámetro --urlcon comillas dobles funcionó para mí

Shehan Weerasooriya
fuente