Wie übergebe ich die Ausgabe eines Befehls als Befehlszeilenargument an einen anderen?

50

Ich habe also ein Skript, das, wenn ich ihm zwei Adressen gebe, zwei HTML-Links durchsucht:

echo "http://maps.google.be/maps?saddr\=$1\&daddr\=$2" | sed 's/ /%/g'

Ich möchte dies senden wgetund dann die Ausgabe in einer Datei namens speichern temp.html. Ich habe es versucht, aber es funktioniert nicht. Kann mir jemand erklären warum und / oder bitte eine Lösung geben?

#!/bin/bash
url = echo "http://maps.google.be/maps?saddr\=$1\&daddr\=$2" |  sed 's/ /%/g'
wget $url
LotoLo
quelle
Um so etwas zu debuggen, müssen Sie häufig Ihre Variablenwerte überprüfen (indem Sie sie an das Terminal senden), um schnell zur Lösung zu gelangen.
Kasterma

Antworten:

48

Sie können Backticks (`) verwenden, um einen Befehl auszuwerten und in der Ausgabe des Befehls zu ersetzen, z.

echo "Number of files in this directory: `ls | wc -l`"

In deinem Fall:

wget `echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g'`
Michael Mrozek
quelle
19

Sie könnten "xargs" verwenden. Ein einfaches Beispiel:

ls -1 *.c | sort -n | xargs cat

Sie müssten darauf achten, dass xargs sein stdin nicht in zwei oder mehr Aufrufe des Kommans aufteilt ("cat" im obigen Beispiel).

Bruce Ediger
quelle
Ich bin hier gelandet, weil ich mich nicht an diesen Befehlsnamen erinnern konnte. Mein bevorzugter Anwendungsfall war in der Tat: xargs -I% some_command --input =% -e -t -c (ich habe es hier als Hinweis für andere angegeben, die der gleichen Spur folgen)
mpasko256
14

Sie führen Ihre URL-Zeile nicht aus:

#!/bin/sh
url="$(echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g')"
wget $url
OneOfOne
quelle
5

Anscheinend könnten Sie hier eine Kombination der Antworten verwenden. Ich vermute, Sie möchten Leerzeichen durch die ASCII-Werte in der URL ersetzen. Dazu müssen Sie sie durch "% 20" und nicht nur durch "%" ersetzen. Hier ist eine Lösung, die Ihnen eine vollständige Antwort geben sollte:

$ wget `echo http://maps.google.be/maps\?saddr\=$1\&daddr\=$2 | sed -e 's/\ /\%20/g'` -q -O temp.html

Die Backticks geben an, dass der beigefügte Befehl zuerst interpretiert und das Ergebnis an wget gesendet werden soll. Beachten Sie, dass ich das Leerzeichen und% chars im sed-Befehl ignoriert habe, um zu verhindern, dass sie falsch interpretiert werden. Die Option -q für wget verhindert, dass die Ausgabe des Befehls auf den Bildschirm gedruckt wird (praktisch für Skripterstellung, wenn Sie sich nicht um den Status in Arbeit kümmern), und die Option -O gibt die Ausgabedatei an. Wenn Sie die Ausgabe nicht in einer Datei speichern, sondern nur im Terminal anzeigen möchten, verwenden Sie "-" anstelle eines Dateinamens, um "stdout" anzugeben.

SethG
quelle
3

wget akzeptiert auch stdin mit dem -switch.

Wenn Sie die Ausgabe in einer Datei speichern möchten, verwenden Sie den -OSchalter.

echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g' | wget -i- -O temp.html
wedeln
quelle