it-swarm-vi.com

Làm thế nào để truyền đầu ra của một lệnh làm đối số dòng lệnh cho một lệnh khác?

Vì vậy, tôi có một tập lệnh mà khi tôi cung cấp cho nó hai địa chỉ, sẽ tìm kiếm hai liên kết HTML:

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

Tôi muốn gửi cái này đến wget và sau đó lưu kết quả đầu ra vào một tệp có tên temp.html. Tôi đã thử điều này, nhưng nó không hoạt động. Ai đó có thể giải thích tại sao và/hoặc cho tôi một giải pháp xin vui lòng?

#!/bin/bash
url = echo "http://maps.google.be/maps?saddr\=$1\&daddr\=$2" |  sed 's/ /%/g'
wget $url
59
Matt D

Bạn có thể sử dụng backticks (`) để đánh giá một lệnh và thay thế trong đầu ra của lệnh, như:

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

Trong trường hợp của bạn:

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

Bạn có thể sử dụng "xargs". Một ví dụ tầm thường:

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

Bạn sẽ phải lưu ý rằng xargs không chia stdin của nó thành hai hoặc nhiều lệnh gọi comman ("con mèo" trong ví dụ trên).

20
Bruce Ediger

bạn không thực sự thực thi dòng url của mình:

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

Có vẻ như bạn có thể sử dụng kết hợp các câu trả lời ở đây. Tôi đoán bạn đang muốn thay thế ký tự không gian bằng các giá trị ascii đã thoát trong url. Để làm điều này, bạn cần thay thế chúng bằng "% 20", không chỉ là "%". Đây là một giải pháp sẽ cung cấp cho bạn một câu trả lời đầy đủ:

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

Các backticks chỉ ra rằng lệnh kèm theo nên được giải thích trước và kết quả được gửi tới wget. Lưu ý rằng tôi đã thoát khỏi khoảng trắng và% ký tự trong lệnh sed để ngăn chúng bị hiểu sai. Tùy chọn -q cho wget ngăn xử lý đầu ra từ lệnh được in ra màn hình (thuận tiện cho việc tạo kịch bản khi bạn không quan tâm đến trạng thái trong công việc) và tùy chọn -O chỉ định tệp đầu ra. FYI, nếu bạn không muốn lưu kết quả đầu ra vào một tệp, nhưng chỉ xem nó trong thiết bị đầu cuối, sử dụng "-" thay vì tên tệp để chỉ ra thiết bị xuất chuẩn.

5
SethG

wget cũng chấp nhận stdin với - công tắc điện.

Nếu bạn muốn lưu đầu ra trong một tệp, hãy sử dụng -O công tắc điện.

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

xargs là tùy chọn tốt nhất để đặt đầu ra từ một lệnh vào đối số của commANGE khác.

Giả sử đầu ra của lệnh1 là 3 và bạn muốn lệnh tiếp theo của bạn thực hiện điều này 3 như một đối số để bạn muốn một cái gì đó như

command2 3(which is output of 1st command) 4 5

Cho rằng bạn có thể đi như thế

command1 | xrgs -I{} command2 {} 4 5

trong đó 4 và 5 là hai đối số khác có thể cần cho command2.

Bạn có thể đặt các dấu ngoặc nhọn đó vào vị trí đối số nơi bạn muốn đầu ra từ lệnh đầu tiên.

Vì vậy, sử dụng

command1 | xrgs -I{} command2 {} 
0
Ria Sharma