Como passar a saída de um comando como o argumento da linha de comando para outro?

32

Então, eu tenho um script que, quando eu der dois endereços, pesquisará dois links HTML:

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

Eu quero enviar isso para wget e salvar a saída em um arquivo chamado temp.html . Eu tentei isso, mas não funciona. Alguém pode explicar por que e / ou me dar uma solução, por favor?

#!/bin/bash
url = echo "http://maps.google.be/maps?saddr\=$1\&daddr\=$2" |  sed 's/ /%/g'
wget $url
    
por LotoLo 12.12.2010 / 23:48

5 respostas

35

Você pode usar backticks (') para avaliar um comando e substituir na saída do comando, como:

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

No seu caso:

wget 'echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g''
    
por 13.12.2010 / 16:18
13

você não está realmente executando sua linha de URL:

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

Você pode usar "xargs". Um exemplo trivial:

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

Você teria que tomar cuidado para que xargs não dividisse seu stdin em duas ou mais invocações do comman ("cat" no exemplo acima).

    
por 13.12.2010 / 16:30
4

Parece que você poderia usar uma combinação das respostas aqui. Eu estou supondo que você está querendo substituir os caracteres de espaço com seus valores ASCII de escape no URL. Para fazer isso, você precisa substituí-los por "% 20", não apenas "%". Aqui está uma solução que deve fornecer uma resposta completa:

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

Os backticks indicam que o comando incluído deve ser interpretado primeiro e o resultado enviado para wget. Observe que escapei do espaço e% chars no comando sed para evitar que eles sejam mal interpretados. A opção -q para wget impede que o resultado do processamento do comando seja impresso na tela (útil para o script quando você não se importa com o status do trabalho) e a opção -O especifica o arquivo de saída. FYI, se você não quiser salvar a saída em um arquivo, mas apenas visualizá-lo no terminal, use "-" em vez de um nome de arquivo para indicar stdout.

    
por 13.12.2010 / 23:25
3

wget também aceita stdin com a opção - .

Se você quiser salvar a saída em um arquivo, use a opção -O .

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