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?


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.


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

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ą.


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

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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.