Como incluir um caractere '&' em uma instrução bash curl

97

Estou tentando usar curl no bash para baixar uma página da Web, mas o &símbolo na URL não é interpretado como um caractere como eu gostaria. Alguma ideia de como posso convencer o bash de que o símbolo &é apenas um personagem chato e nada de especial?

Chernoff
fonte
Dê uma olhada no seguinte tópico que deve ajudá-lo - stackoverflow.com/questions/2067969/…
morgents
Eu tentei substituir o &símbolo com \&, '&', "&", ^&mas não foram capazes de obter o URL para avaliar corretamente. Na verdade, '&'funciona quando executo o comando curl do Terminal.app, mas falha quando o coloco em um script bash, envolvo em um loop e o executo.
Chernoff

Respostas:

121

Colocar todo o URL entre aspas duplas deve resolver o seu problema.

mjuarez
fonte
9
aspas simples podem ser melhores, a menos que haja necessidade de resolver variáveis.
jpm
Quando eu uso aspas em todo o URL, a expressão ${i}não retorna um valor.
Chernoff
2
No meu caso, as aspas duplas falharam, enquanto as aspas simples funcionaram perfeitamente.
abeboparebop
3
Tenha cuidado com o programa usado para digitar as aspas. Enquanto estava com pressa para editar um script de shell, usei um programa de edição de texto. Colocava aspas inclinadas em vez de aspas duplas retas. Isso realmente bagunça o script e torna o problema difícil de encontrar!
David
39
curl "http://www.example.com?m=method&args=1"

Você está usando o & como delimitador para um URL GET? Ou está em um dado?

Se estiver em dados, você deve codificá-lo para um caractere HTML, caso contrário, coloque-o entre aspas.

A codificação para &deve se tornar %26no URL.

curl "http://www.example.com?m=this%26that
Matt Clark
fonte
Estou usando o &símbolo como um dado, quase exatamente como você mostrou. O problema é que, em vez de valores numéricos, estou usando ${i}. Então, eu quero http://www.example.com?m=method&args=${i}avaliar como um URL.
Chernoff
3
A maneira como acabei de mostrar a URL usa o '&' como um delimitador para as variáveis ​​GET, então agora estou confuso, em $ [i] você tem um dado que contém '&'? Se for esse o caso, você precisará codificá-lo em URL. & =% 26
Matt Clark
1
Procurei em toda a internet e não encontrei a solução. @MattClark você é o herói. Acabei de codificar o url e que era um dado e meu script está funcionando bem.
Haris ur Rehman
1
Está faltando "no final do segundo trecho de código?
David
23

Colocar aspas simples ao redor do &símbolo parece funcionar. Ou seja, usar uma URL como http://www.example.com/page.asp?arg1=${i}'&'arg2=${j}curl retorna a página da web solicitada.

Chernoff
fonte
2
você deve incluir o requisito do argumento na questão para que fique claro para futuras visualizações.
Manatax
Por que essa resposta foi aceita? Esta resposta deve ser acedida stackoverflow.com/a/13339492/2898694
Sharikov Vladislav
13

Em vez de tentar os caracteres de escape "&", você pode especificar parâmetros de url http em solicitações POST com o parâmetro -d conforme mostrado abaixo:

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

Se a solicitação for um GET, você também deve adicionar a opção -G, que diz ao curl para enviar os dados com a solicitação GET.

curl -X GET -G http://www.example.com \
-d arg1=this \
-d arg2=that
noego
fonte
Esta é a melhor resposta! THX!
unbreak
Isso funcionou para mim. Adicionar aspas duplas não funcionou.
Juhog
9

Você pode usar em seu %26lugar &. O código da entidade funcionará bem.

Seralto
fonte
0

Use o parâmetro --urlcom aspas duplas funcionou para mim

Shehan Weerasooriya
fonte