Come includere un carattere "&" in un'istruzione bash curl


98

Sto cercando di utilizzare curl in bash per scaricare una pagina web, ma il &simbolo nell'URL non viene interpretato come un carattere come vorrei. Qualche idea su come posso convincere Bash che il simbolo &è solo un personaggio noioso e niente di speciale?


Dai

Ho provato a sostituire il &simbolo con \&, '&', "&", ^&ma non sono stati in grado di ottenere l'URL di valutare correttamente. In realtà, '&'funziona quando eseguo il comando curl da Terminal.app, ma fallisce quando lo inserisco in uno script bash, lo avvolgo in un ciclo e lo eseguo.
Chernoff

Risposte:


122

Mettere l'intero URL tra virgolette doppie dovrebbe risolvere il tuo problema.


9
virgolette singole potrebbero essere migliori, a meno che non sia necessario risolvere le variabili.
jpm

Quando utilizzo le virgolette attorno all'intero URL, l'espressione ${i}non restituisce un valore.
Chernoff

2
Nel mio caso, le virgolette doppie non sono riuscite mentre le virgolette singole hanno funzionato bene.
abeboparebop

3
Si prega di prestare attenzione al programma utilizzato per digitare le virgolette. Mentre avevo fretta di modificare uno script di shell, ho usato un programma di modifica del testo. Mette virgolette inclinate invece di doppie virgolette diritte. Questo rovina davvero lo script e rende il problema difficile da trovare!
David

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

Stai usando il & come delimitatore per un URL GET? O è in un pezzo di dati?

Se è nei dati, devi codificarlo in un carattere HTML, altrimenti racchiuderlo tra virgolette.

La codifica per &dovrebbe diventare %26nell'URL.

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

Sto usando il &simbolo come un dato, quasi esattamente come hai mostrato. Il problema è che, invece dei valori numerici che sto usando ${i}. Quindi voglio arrivare http://www.example.com?m=method&args=${i}a valutare come URL.
Chernoff

3
Il modo in cui ho appena mostrato l'URL usa "&" come delimitazione per le variabili GET, quindi ora sono confuso, in $ [i] hai un dato che contiene "&"? In tal caso, sarà necessario codificarlo nell'URL. & =% 26
Matt Clark

1
Ho cercato in tutta Internet non sono riuscito a trovare la soluzione. @ MattClark tu sei l'eroe. Ho appena codificato l'URL e che era un pezzo di dati e il mio script funziona bene.
Haris ur Rehman

1
Manca un "alla fine del secondo snippet di codice?
David

23

Mettere virgolette singole intorno al &simbolo sembra funzionare. Cioè, l'utilizzo di un URL come http://www.example.com/page.asp?arg1=${i}'&'arg2=${j}con curl restituisce la pagina web richiesta.


2
dovresti includere il requisito dell'argomento sulla domanda in modo che sia chiaro per le visualizzazioni future.
Manatax

Perché questa risposta è accolta? Questa risposta deve essere acceped stackoverflow.com/a/13339492/2898694
Pallinov Vladislav

13

Invece di provare i caratteri di escape "&", puoi specificare i parametri dell'URL http nelle richieste POST con il parametro -d come mostrato di seguito:

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

Se la richiesta è GET, dovresti anche aggiungere l'opzione -G, che dice a curl di inviare i dati con la richiesta GET.

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

Questa è la migliore risposta! Grazie!
unbreak

Questo ha funzionato per me. L'aggiunta di virgolette doppie non ha funzionato.
Juhog

9

Puoi usare %26invece &. Il codice entità funzionerà correttamente.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.