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?



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.


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

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.


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

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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.