Як передати висновок однієї команди як аргумент командного рядка іншій?


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

Для налагодження чогось подібного, перевірка змінних значень (шляхом повторення їх до терміналу) часто приводить вас до рішення.
kasterma

Відповіді:


48

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

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 не розділив свій stdin на два або більше викликів коміна ("кішка" у прикладі вище).


Я опинився тут, бо не міг запам'ятати цю назву команди. Мій улюблений випадок використання справді був: 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

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. Зауважте, що я уникнув пробілу та% символів у команді sed, щоб запобігти їх неправильному трактуванню. Параметр -q для wget запобігає обробці результатів з команди, надрукованої на екран (зручно для сценаріїв, коли вам не важливо стан роботи), а параметр -O визначає вихідний файл. FYI, якщо ви не хочете зберегти вихід у файл, а просто переглянути його в терміналі, використовуйте "-" замість імені файлу для позначення stdout.


3

wget також приймає stdin з -комутатором.

Якщо ви хочете зберегти вихід у файлі, використовуйте -Oперемикач.

echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g' | wget -i- -O temp.html
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.