Jak przekazać dane wyjściowe jednego polecenia jako argument wiersza polecenia do drugiego?

50

Mam więc skrypt, który podając mu dwa adresy, przeszuka dwa linki HTML:

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

Chcę to wysłać, wgeta następnie zapisać dane wyjściowe w pliku o nazwie temp.html. Próbowałem tego, ale to nie działa. Czy ktoś może wyjaśnić, dlaczego i / lub dać mi rozwiązanie?

#!/bin/bash
url = echo "http://maps.google.be/maps?saddr\=$1\&daddr\=$2" |  sed 's/ /%/g'
wget $url
LotoLo
źródło
W przypadku debugowania czegoś takiego jak sprawdzenie wartości zmiennych (poprzez wysłanie ich do terminala) często szybko dochodzi do rozwiązania.
kasterma

Odpowiedzi:

48

Możesz użyć backticks (`) do oceny polecenia i podstawienia w danych wyjściowych polecenia, takich jak:

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

W Twoim przypadku:

wget `echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g'`
Michał Mrożek
źródło
13
Zobacz, dlaczego $(...)preferowane są backtyki .
jasonwryan,
19

Możesz użyć „xargs”. Trywialny przykład:

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

Musisz uważać, aby xargs nie podzielił stdin na dwie lub więcej wywołań komendy („cat” w powyższym przykładzie).

Bruce Ediger
źródło
Skończyłem tutaj, ponieważ nie mogłem zapamiętać tej nazwy polecenia. Mój ulubiony przypadek użycia to: xargs -I% some_command --input =% -e -t -c (umieszczam to tutaj jako notatkę dla innych, którzy podążają tym samym śladem)
mpasko256
14

tak naprawdę nie wykonujesz linii URL:

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

Wygląda na to, że możesz tutaj użyć kombinacji odpowiedzi. Zgaduję, że chcesz zastąpić znaki spacji ich wartościami ascii w adresie URL. Aby to zrobić, musisz zastąpić je „% 20”, a nie tylko „%”. Oto rozwiązanie, które powinno dać ci pełną odpowiedź:

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

Backticks wskazują, że załączone polecenie powinno być najpierw zinterpretowane, a wynik przesłany do wget. Zauważ, że uniknąłem spacji i% znaków w poleceniu sed, aby zapobiec ich błędnej interpretacji. Opcja -q dla wget zapobiega przetwarzaniu danych wyjściowych z polecenia drukowanego na ekranie (przydatne przy skryptach, gdy nie obchodzi cię status pracy), a opcja -O określa plik wyjściowy. Do Twojej wiadomości, jeśli nie chcesz zapisać wyniku w pliku, ale po prostu wyświetlić go w terminalu, użyj „-” zamiast nazwy pliku, aby wskazać standardowe wyjście.

SethG
źródło
3

wget akceptuje również standardowe wejście z -przełącznikiem.

Jeśli chcesz zapisać dane wyjściowe w pliku, użyj -Oprzełącznika.

echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g' | wget -i- -O temp.html
machać
źródło