如何将一个命令的输出作为命令行参数传递给另一个命令?

78 command-line shell bash

所以我有一个脚本,当我给它两个地址时,它将搜索两个 HTML 链接:

echo "http://maps.google.be/maps?saddr\=$1\&daddr\=$2" | sed 's/ /%/g'
Run Code Online (Sandbox Code Playgroud)

我想将它发送到wget然后将输出保存在一个名为temp.html. 我试过这个,但它不起作用。有人可以解释原因和/或给我一个解决方案吗?

#!/bin/bash
url = echo "http://maps.google.be/maps?saddr\=$1\&daddr\=$2" |  sed 's/ /%/g'
wget $url
Run Code Online (Sandbox Code Playgroud)

Mic*_*zek 79

您可以使用反引号 (`) 来评估命令并替换命令的输出,例如:

echo "Number of files in this directory: `ls | wc -l`"
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

wget `echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g'`
Run Code Online (Sandbox Code Playgroud)

  • 参见 [为什么`$(...)` 比反引号更受欢迎](http://mywiki.wooledge.org/BashFAQ/082)。 (29认同)

Bru*_*ger 33

你可以使用“xargs”。一个简单的例子:

ls -1 *.c | sort -n | xargs cat
Run Code Online (Sandbox Code Playgroud)

您必须注意 xargs 不会将其标准输入拆分为两个或多个命令调用(上例中的“cat”)。

  • 嘿@frederix 谁让你进来的?我看他们这些天只会让任何人进来!洛洛洛 (2认同)

One*_*One 17

你实际上并没有执行你的 url 行:

#!/bin/sh
url="$(echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g')"
wget $url
Run Code Online (Sandbox Code Playgroud)


小智 5

似乎您可以在这里使用答案的组合。我猜你想用它们在 url 中转义的 ascii 值替换空格字符。为此,您需要将它们替换为“%20”,而不仅仅是“%”。这是一个应该给你一个完整答案的解决方案:

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

反引号表示应该首先解释所包含的命令,然后将结果发送到 wget。请注意,我在 sed 命令中对空格和 % 字符进行了转义,以防止它们被误解。wget 的 -q 选项可防止处理打印到屏幕的命令的输出(当您不关心工作状态时编写脚本很方便),并且 -O 选项指定输出文件。仅供参考,如果您不想将输出保存到文件,而只想在终端中查看它,请使用“-”而不是文件名来指示标准输出。


小智 5

xargs是将一个命令的输出放入另一个命令的参数中的最佳选择。

假设 command1 的输出是,3并且您希望下一个命令将其3作为参数,您将需要这样的内容

command2 3(which is output of 1st command) 4 5
Run Code Online (Sandbox Code Playgroud)

所以,为此你可以这样做

command1 | xargs -I{} command2 {} 4 5
Run Code Online (Sandbox Code Playgroud)

其中 4 和 5 是 可能需要的另外两个参数command2。

您可以将大括号放在您想要第一个命令输出的位置。

所以,使用

command1 | xargs -I{} command2 {} 
Run Code Online (Sandbox Code Playgroud)