Richtig mit curl --data-urlencode bei der übergabe einer variable
Ich versuche meinen code zu optimieren und ein bestimmtes Stück code ist geliehen. Ich möchte zum entfernen der sed, also bin ich nicht mit allen externen Prozessen in meine main-Schleife.
function sendMsg () {
value=$(echo $1 | sed 's//%20/g;s/!/%21/g;s/"/%22/g;s/#/%23/g;s/\&/%26/g;s/'\''/%28/g;s/(/%28/g;s/)/%29/g;s/:/%3A/g;s/\//%2F/g');
str="http://www.xxxx.com/api.ashx?v=1&k=$Key&a=send&w=$value";
curl -s $str;
}
Habe ich bearbeitet diese für Klarheit. Der $Wert ist, einfach zu konvertieren, um eine korrekte url für die Ausgabe über den curl-Befehl am Ende der Funktion.
Das funktioniert zwar ganz gut, meistens bin ich daran interessiert, diese so schnell wie möglich, ohne Verzweigung zu außerhalb verarbeitet, wenn ich kann.
Danke für die Kommentare so weit!!!
Wo ich bin, so weit ist diese:
function sendMsg () {
str="http://www.xxxx.com/api.ashx?v=1&k=$Key&a=send&w=";
curl -s $str --data-urlencode "$1";
}
Bin ich auf dem richtigen Weg mindestens?
- Ja, es wäre schneller in der bash. Obwohl bash-die Sprache ist langsam, beginnend einen Teilprozess, die Lektüre seiner Ausgabe, und wait()ing für es zu beenden ist viel, viel langsamer als ein paar Dutzend parameter-Erweiterungen.
- ...ein microbenchmark (dabei entweder Ansatz in einer Schleife) wäre die umfassende Möglichkeit zur Beantwortung dieser, weißte.
- ...das heißt, wenn Ihr Ziel ist es, die Umsetzung richtige escaping von beliebigen Daten, die für die Bildung der URLs, würde ich argumentieren, dass die Richtige Antwort ist nicht sed oder parameter-Erweiterungen, sondern auch, um eine kanonische Implementierung andere Menschen haben getestet, für Jahre in kniffligen Sonderfällen-wie z.B. in Python
urllib.quote()
. - Vielen Dank für die Klarstellung das Thema. Wären Sie in der Lage zu starten mich aus, wie um diese Situation zu bewältigen?
- ...btw,
echo "$1"
unterscheidet sich vonecho $1
-- letzteres beispielsweise, ersetzen*
(wenn auf Ihrer eigenen oder durch Leerzeichen getrennt werden) mit einer Liste der Dateien im aktuellen Verzeichnis; ersetzen Sie läuft von whitespaces (oder andere whitespace-Zeichen wie Zeilenumbrüche) durch ein einzelnes Leerzeichen, und sonst zerfleischen Sie Ihre Daten. - Ja, der code ist Folgendes zu formatieren $1-a $ - Wert für das senden aus, um eine curl-Prozess
- in welchem konkreten Zusammenhang? curl oft url-encoding für Sie, so ist es oft unnötig, es selbst zu tun ersten. Natürlich, wenn Sie nicht mit dem korrekten zitieren beim Aufruf von curl, shell-string-splitting Effekte können verursachen Fehler, die Aussehen wie Sie sind, verursacht wird (oder fest) durch urlencoding Inhalt.
- Sollten Sie als
--data-urlencode
. - Versucht der curl-route, wenn jemand hätte nichts dagegen, an meinem bearbeiteten Frage.
- Ihre Frage ist schon völlig anders als die Vorherige. Ich denke, du solltest einfach akzeptiert, die Antwort, dass es fest und erstellt eine andere Frage.
- Ich bin sehr neu in diesem, und hatte eine 'falsche' Frage von Anfang an. Ich entschuldige mich, wenn ich etwas aus der norm für die regelmäßigen Nutzer hier. Dank einiger Kommentare von @Charles Duffy, führte er mich zu der Frage, die richtige Frage, die ich brauchte Hilfe. Ist die Verfeinerung Ihrer Frage, was Sie eigentlich brauchen, um erreichen nicht dazu ermutigt hier? Ich bin ein wenig verwirrt, sorry.
- Vollständig ersetzen Sie Ihre Frage (im Gegensatz zu verfeinern es), nachdem diese bereits beantwortet ist eine schlechte Praxis. Bitte Rollback der änderungen und Fragen die neue Frage separat.
- ...übrigens, nebenbei-die
function
keyword ist etwas fragwürdige Praxis, da Sie Ihre scripts nicht kompatibel mit POSIX-sh ohne nutzen über die POSIX-Funktion Deklaration syntax:myFunc() {
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersten, die Antwort auf deine Frage: Wenn du eine einzelne substitution oder filtern, mit pattern-matching ist schneller:
Den ersten nicht laichen benötigen Sie eine sub-shell, und läuft
sed
, dann ersetzen diese wieder in$foo
. Allerdings, wenn Sie tun dies, fast ein Dutzend mal, ich glaube, mitsed
kann schneller sein:Beachten Sie, dass diese syntax ist einfacher zu Lesen, da jede substitution Befehl steht auf einer eigenen Zeile. Beachten Sie auch, dass
<<<
entfällt die Notwendigkeit, zu echo und pipe.Diese nur von einem einzigen Aufruf
sed
beim pattern matching muss getan werden, mehrere Male.Allerdings sollten Sie mit
--data
und--data-uuencode
anstatt der query-string selbst:Den
--data--urlencode
kodiert den Wert der$value
für Sie, so dass Sie nicht haben, um es zu tun. Leider ist dieser parameter nicht vorhanden ist in allen Versionen voncurl
. Es wurde Hinzugefügt in version 7.18.0 wieder im Januar 2008. Führen Siecurl --version
zu sehen, welche version Sie haben:Nachtrag
Kann ich nicht testen, was Sie haben, aber ich beschlossen, zu versuchen, unseren Jenkins-server zu sehen, wenn ich den build Beschreibung. Ich sorgte dafür, dass die Beschreibung Leerzeichen, so Bedarf es
--data-urlencoding
. Mit diesem Befehl gearbeitet:Das ist, wie wenn ich habe:
Beachten Sie, dass
--data
fügt das Fragezeichen für Sie.(Nein,
swordfish
ist nicht mein Kennwort).Es ist nicht so Komplex, wie Ihr Befehl, aber es könnte helfen, darauf hinweisen, wo Sie Probleme haben. Sie haben einen Benutzernamen und ein Passwort? Wenn ja, müssen Sie die
--user
parameter.curl 7.29.0 (x86_64-pc-linux-gnu) libcurl/7.29.0 OpenSSL/1.0.1c zlib/1.2.7 libidn/1.25 librtmp/2.3 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smtp smtps telnet tftp Features: GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
--data
fügt die?
für Sie.?
an der falschen Stelle. Ich manuell eingegeben, was die URL Aussehen würde. Ich habe korrigiert die URL. Ich bin froh, dass Sie es herausgefunden hat.Wenn Sie haben, dies zu tun eine Menge, der Aufwand von Laich mehrere
sed
Prozesse können sich addieren. In diesem Fall können Sie die folgenden Linien statt:--data-urlencode
wäre schneller (und wesentlich einfacher zu pflegen), wenn es anwendbar ist, also ich würde die Zeit nehmen, zu untersuchen.