Jak dołączyć znak „&” do instrukcji bash curl

100

Próbuję użyć curl w bash, aby pobrać stronę internetową, ale &symbol w adresie URL nie jest interpretowany jako znak, tak jak bym chciał. Jakieś pomysły, jak mogę przekonać basha, że ​​symbol &jest tylko nudną postacią i niczym szczególnym?

Chernoff
źródło
Spójrz na następujący temat, który powinien ci pomóc - stackoverflow.com/questions/2067969/…
morgents
Próbowałem zastępując &symbol z \&, '&', "&", ^&ale nie byli w stanie uzyskać adres URL, aby ocenić prawidłowo. Właściwie '&'działa, gdy uruchamiam polecenie curl z Terminal.app, ale kończy się niepowodzeniem, gdy umieszczam je w skrypcie bash, zawijam w pętlę i uruchamiam.
Chernoff

Odpowiedzi:

125

Umieszczenie całego adresu URL w podwójnych cudzysłowach powinno rozwiązać problem.

mjuarez
źródło
9
pojedyncze cudzysłowy mogą być lepsze, chyba że istnieje potrzeba rozwiązywania zmiennych.
jpm
Kiedy używam cudzysłowów wokół całego adresu URL, wyrażenie ${i}nie zwraca wartości.
Chernoff
2
W moim przypadku podwójne cudzysłowy zawiodły, podczas gdy pojedyncze cudzysłowy działały dobrze.
abeboparebop
3
Należy zachować ostrożność, który program jest używany do wpisywania cudzysłowów. Spiesząc się z edycją skryptu powłoki, użyłem programu do edycji tekstu. Umieszczał ukośne cudzysłowy zamiast prostych podwójnych cudzysłowów. To naprawdę psuje skrypt i utrudnia znalezienie problemu!
David
41
curl "http://www.example.com?m=method&args=1"

Czy używasz znaku & jako separatora adresu URL GET? Czy jest w danych?

Jeśli jest w danych, musisz zakodować go na znak HTML, jeśli nie, ująć go w cudzysłów.

Kodowanie &powinno znaleźć się %26w adresie URL.

curl "http://www.example.com?m=this%26that
Matt Clark
źródło
Używam &symbolu jako danych, prawie dokładnie tak, jak pokazałeś. Problem polega na tym, że zamiast wartości liczbowych używam ${i}. Więc chcę http://www.example.com?m=method&args=${i}ocenić jako adres URL.
Chernoff
3
Sposób, w jaki właśnie pokazałem adres URL, używa „&” jako separatora dla zmiennych GET, więc teraz jestem zdezorientowany, w $ [i] masz fragment danych zawierający „&”? Jeśli tak jest, musisz zakodować URL. & =% 26
Matt Clark
1
Przeszukałem cały internet i nie mogłem znaleźć rozwiązania. @MattClark jesteś bohaterem. Właśnie zakodowałem adres URL i był to fragment danych, a mój skrypt działa dobrze.
Haris ur Rehman
1
Czy brakuje wyrażenia „na końcu drugiego fragmentu kodu?”
David
24

&Wydaje się, że umieszczanie pojedynczych cudzysłowów wokół symbolu działa. Oznacza to, że użycie adresu URL takiego jak http://www.example.com/page.asp?arg1=${i}'&'arg2=${j}curl zwraca żądaną stronę internetową.

Chernoff
źródło
2
należy dołączyć wymóg argumentacji do pytania, aby było jasne dla przyszłych poglądów.
Manatax,
Dlaczego ta odpowiedź jest akceptowana? Ta odpowiedź musi zostać zaakceptowana stackoverflow.com/a/13339492/2898694
Sharikov Vladislav
13

Zamiast próbować używać znaków zmiany znaczenia „&”, możesz określić parametry adresu URL http w żądaniach POST za pomocą parametru -d, jak pokazano poniżej:

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

Jeśli żądanie jest GET, należy również dodać opcję -G, która mówi curlowi, aby wysłał dane za pomocą żądania GET.

curl -X GET -G http://www.example.com \
-d arg1=this \
-d arg2=that
noego
źródło
To najlepsza odpowiedź! Dzięki!
rozpaść
To zadziałało dla mnie. Nie udało się dodać cudzysłowów.
Juhog
9

Możesz użyć %26zamiast tego &. Kod jednostki będzie działał dobrze.

Seralto
źródło
0

Użyj parametru --urlz podwójnymi cudzysłowami, które zadziałały dla mnie

Shehan Weerasooriya
źródło