So fügen Sie ein '&' -Zeichen in eine Bash-Curl-Anweisung ein

97

Ich versuche, Curl in Bash zum Herunterladen einer Webseite zu verwenden, aber das &Symbol in der URL wird nicht wie gewünscht als Zeichen interpretiert. Irgendwelche Ideen, wie ich bash davon überzeugen kann, dass das Symbol &nur ein langweiliger Charakter und nichts Besonderes ist?

Chernoff
quelle
Werfen
Morgents
Ich habe versucht , den Austausch &mit dem Symbol \&, '&', "&", ^&haben aber nicht die URL bekommen konnten richtig zu bewerten. Eigentlich '&'funktioniert das, wenn ich den Befehl curl über Terminal.app ausführe, aber wenn ich ihn in ein Bash-Skript einfüge, in eine Schleife einwickle und ausführe, schlägt dies fehl.
Chernoff

Antworten:

121

Wenn Sie die gesamte URL in doppelte Anführungszeichen setzen, sollte sich Ihr Problem beheben.

mjuarez
quelle
9
einfache Anführungszeichen sind möglicherweise besser, es sei denn, Variablen müssen aufgelöst werden.
Jpm
Wenn ich Anführungszeichen um die gesamte URL verwende, gibt der Ausdruck ${i}keinen Wert zurück.
Chernoff
1
In meinem Fall sind doppelte Anführungszeichen fehlgeschlagen, während einfache Anführungszeichen einwandfrei funktionierten.
Abeboparebop
3
Bitte seien Sie vorsichtig, mit welchem ​​Programm die Anführungszeichen eingegeben werden. Während ich es eilig hatte, ein Shell-Skript zu bearbeiten, verwendete ich ein Textbearbeitungsprogramm. Es wurden schräge Anführungszeichen anstelle von geraden doppelten Anführungszeichen gesetzt. Dies bringt das Skript wirklich durcheinander und macht es schwierig, das Problem zu finden!
David
39
curl "http://www.example.com?m=method&args=1"

Verwenden Sie das & als Trennzeichen für eine GET-URL? Oder ist in einem Datenelement?

Wenn es sich um Daten handelt, müssen Sie es in ein HTML-Zeichen codieren. Wenn nicht, umgeben Sie es mit Anführungszeichen.

Die Codierung für &sollte %26in der URL enthalten sein.

curl "http://www.example.com?m=this%26that
Matt Clark
quelle
Ich verwende das &Symbol als Datenelement, fast genau so, wie Sie es gezeigt haben. Der Haken ist, dass ich anstelle von numerischen Werten verwende ${i}. Ich möchte also http://www.example.com?m=method&args=${i}als URL auswerten.
Chernoff
3
Die Art und Weise, wie ich gerade die URL angezeigt habe, verwendet das '&' als Delimeter für die GET-Variablen. Jetzt bin ich verwirrt. In $ [i] haben Sie ein Datenelement, das '&' enthält. In diesem Fall müssen Sie die URL verschlüsseln. & =% 26
Matt Clark
1
Durchsucht das gesamte Internet konnte die Lösung nicht finden. @ MattClark du bist der Held. Ich habe gerade eine URL codiert und das war ein Datenelement und mein Skript funktioniert einwandfrei.
Haris ur Rehman
1
Fehlt ein "am Ende des zweiten Code-Snippets?
David
23

Das Anführungszeichen um das &Symbol zu setzen scheint zu funktionieren. Das heißt, wenn Sie eine URL wie http://www.example.com/page.asp?arg1=${i}'&'arg2=${j}mit curl verwenden, wird die angeforderte Webseite zurückgegeben.

Chernoff
quelle
2
Sie sollten die Argumentationsanforderung in die Frage aufnehmen, damit sie für zukünftige Ansichten klar ist.
Manatax
Warum wird diese Antwort beantwortet? Diese Antwort muss akzeptiert werden stackoverflow.com/a/13339492/2898694
Vladislav
13

Anstatt die Escape-Zeichen "&" zu versuchen, können Sie http-URL-Parameter in POST-Anforderungen mit dem Parameter -d wie folgt angeben:

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

Wenn es sich bei der Anforderung um ein GET handelt, sollten Sie auch die Option -G hinzufügen, mit der curl angewiesen wird, die Daten mit der GET-Anforderung zu senden.

curl -X GET -G http://www.example.com \
-d arg1=this \
-d arg2=that
noego
quelle
Das ist die beste Antwort! Vielen Dank!
Unbreak
Das hat bei mir funktioniert. Das Hinzufügen von doppelten Anführungszeichen hat nicht funktioniert.
Juhog
9

Sie können %26stattdessen verwenden &. Der Entitätscode funktioniert einwandfrei.

Seralto
quelle
0

Verwenden Sie den Parameter --urlmit doppelten Anführungszeichen, die für mich gearbeitet haben

Shehan Weerasooriya
quelle