Comment passer le résultat d'une commande en tant qu'argument de ligne de commande à une autre?

50

J'ai donc un script qui, lorsque je lui donne deux adresses, va rechercher deux liens HTML:

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

Je veux envoyer ceci à wget, puis enregistrer la sortie dans un fichier appelé temp.html. J'ai essayé ça, mais ça ne marche pas. Quelqu'un peut-il expliquer pourquoi et / ou me donner une solution s'il vous plaît?

#!/bin/bash
url = echo "http://maps.google.be/maps?saddr\=$1\&daddr\=$2" |  sed 's/ /%/g'
wget $url
LotoLo
la source
Pour déboguer quelque chose comme ceci, vérifier vos valeurs de variable (en les renvoyant au terminal) vous amène souvent à la solution rapidement.
kasterma

Réponses:

48

Vous pouvez utiliser backticks (`) pour évaluer une commande et la remplacer dans la sortie de la commande, comme suit:

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

Dans ton cas:

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

Vous pouvez utiliser "xargs". Un exemple trivial:

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

Veillez à ce que xargs ne divise pas son stdin en deux ou plusieurs invocations du comman ("cat" dans l'exemple ci-dessus).

Bruce Ediger
la source
Je me suis retrouvé ici, car je ne me souvenais plus du nom de cette commande. Mon cas d'utilisation préférée était en effet: xargs -I% une_commande --input =% -e -t -c (je mets ici comme une note pour les autres qui suivent la même trace)
mpasko256
14

vous n'exécutez pas réellement votre ligne d'URL:

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

Il semble que vous pourriez utiliser une combinaison des réponses ici. Je suppose que vous voulez remplacer les caractères d'espace par leurs valeurs ascii échappées dans l'URL. Pour ce faire, vous devez les remplacer par "% 20", pas seulement "%". Voici une solution qui devrait vous donner une réponse complète:

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

Les backticks indiquent que la commande incluse doit être interprétée en premier et que le résultat est envoyé à wget. Notez que j'ai échappé à l'espace et à% caractères de la commande sed pour éviter toute erreur d'interprétation. L'option -q pour wget empêche le traitement de la sortie de la commande en cours d'impression à l'écran (pratique pour les scripts lorsque l'état du travail est indifférent) et l'option -O spécifie le fichier de sortie. Pour votre information, si vous ne souhaitez pas enregistrer la sortie dans un fichier, mais la visualiser dans le terminal, utilisez "-" au lieu d'un nom de fichier pour indiquer stdout.

SethG
la source
3

wget accepte également stdin avec le -commutateur.

Si vous souhaitez enregistrer la sortie dans un fichier, utilisez le -Ocommutateur.

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