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?


50

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 wgetvà sau đó lưu đầu ra trong 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

Để gỡ lỗi một cái gì đó như thế này, việc kiểm tra các giá trị biến của bạn (bằng cách lặp lại chúng đến thiết bị đầu cuối) thường đưa bạn đến giải pháp nhanh chóng.
kasterma

Câu trả lời:



19

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).


Tôi đã kết thúc ở đây, vì tôi không thể nhớ tên lệnh này. Trường hợp sử dụng yêu thích của tôi thực sự là: xargs -I% some_command --input =% -e -t -c (Tôi đặt nó ở đây như một ghi chú cho những người khác theo cùng dấu vết)
mpasko256

14

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

5

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.


3

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

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

echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g' | wget -i- -O temp.html
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.