Как передать вывод одной команды в качестве аргумента командной строки другой?

50

Итак, у меня есть скрипт, который, когда я дам ему два адреса, будет искать две HTML-ссылки:

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

Я хочу отправить это, wgetа затем сохранить вывод в файле с именем temp.html. Я пробовал это, но это не работает. Может кто-нибудь объяснить, почему и / или дать мне решение, пожалуйста?

#!/bin/bash
url = echo "http://maps.google.be/maps?saddr\=$1\&daddr\=$2" |  sed 's/ /%/g'
wget $url
LotoLo
источник
Для отладки чего-либо подобного, проверка значений переменных (вывод их в терминал) часто приводит вас к решению быстро.
Кастерма

Ответы:

48

Вы можете использовать backticks (`) для оценки команды и замены в выводе команды, например:

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

В твоем случае:

wget `echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g'`
Михаил Мрозек
источник
19

Вы можете использовать «xargs». Тривиальный пример:

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

Вы должны позаботиться о том, чтобы xargs не разделял свой стандартный ввод на два или более вызовов comman («cat» в приведенном выше примере).

Брюс Эдигер
источник
Я оказался здесь, потому что не мог вспомнить название этой команды. Мой любимый вариант использования действительно был: xargs -I% some_command --input =% -e -t -c (я помещу это здесь как примечание для других, которые следуют той же трассе)
mpasko256
14

вы на самом деле не выполняете свою строку URL:

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

Кажется, вы могли бы использовать комбинацию ответов здесь. Я предполагаю, что вы хотите заменить пробелы на их экранированные значения ascii в URL. Для этого вам необходимо заменить их на «% 20», а не только на «%». Вот решение, которое должно дать вам полный ответ:

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

Обратные пометки указывают, что вложенная команда должна быть интерпретирована первой, а результат отправлен в wget. Обратите внимание, что я избежал пробела и% chars в команде sed, чтобы предотвратить их неправильное толкование. Параметр -q для wget предотвращает обработку выходных данных команды, выводимой на экран (удобно для сценариев, когда вас не интересует состояние в работе), а параметр -O указывает выходной файл. К вашему сведению, если вы не хотите сохранять выходные данные в файл, а просто просматриваете их в терминале, используйте «-» вместо имени файла, чтобы указать стандартный вывод.

SethG
источник
3

Wget также принимает стандартный ввод с -переключателем.

Если вы хотите сохранить вывод в файл, используйте -Oпереключатель.

echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g' | wget -i- -O temp.html
шутник
источник