कमांड-लाइन तर्क के रूप में एक कमांड के आउटपुट को दूसरे से कैसे पास करें?


50

इसलिए मेरे पास एक स्क्रिप्ट है, जब मैं इसे दो पते देता हूं, दो HTML लिंक खोजेगा:

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

मैं इसे भेजना चाहता हूं wgetऔर फिर आउटपुट को एक फाइल में सेव करना चाहता हूं temp.html। मैंने यह कोशिश की, लेकिन यह काम नहीं करता है। क्या कोई समझा सकता है कि / और मुझे एक समाधान क्यों दें?

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

डिबगिंग के लिए कुछ इस तरह से अपने वैरिएबल वैल्यू (टर्मिनल पर उन्हें इको-इन) चेक करने से अक्सर आपको जल्दी से समाधान मिल जाता है।
kasterma

जवाबों:


48

आप कमांड के आउटपुट में एक कमांड और स्थानापन्न का मूल्यांकन करने के लिए backticks (`) का उपयोग कर सकते हैं, जैसे:

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

आपके मामले में:

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


19

आप "xargs" का उपयोग कर सकते हैं। एक तुच्छ उदाहरण:

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

आपको इस बात का ध्यान रखना होगा कि xargs अपने स्टड को कॉमन (ऊपर के उदाहरण में "बिल्ली" के दो या अधिक चालानों में विभाजित नहीं करता है)।


मैं यहाँ समाप्त हुआ, क्योंकि मुझे यह कमांड नाम याद नहीं था। मेरा पसंदीदा उपयोग मामला वास्तव में था: xargs -I% some_command --input =% -e -t -c (मैं इसे अन्य लोगों के लिए एक नोट के रूप में यहाँ रखता हूं जो समान ट्रेस का पालन करते हैं)
mpasko256

14

आप वास्तव में अपनी url लाइन निष्पादित नहीं कर रहे हैं:

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

5

ऐसा लगता है कि आप यहां उत्तरों के संयोजन का उपयोग कर सकते हैं। मैं अनुमान लगा रहा हूं कि आप url में अपने बच गए ascii मूल्यों के साथ अंतरिक्ष वर्ण को बदलना चाहते हैं। ऐसा करने के लिए, आपको उन्हें "% 20" से बदलने की आवश्यकता है, न कि केवल "%"। यहाँ एक समाधान है जो आपको पूर्ण उत्तर देना चाहिए:

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

बैकटिक्स से संकेत मिलता है कि संलग्न कमांड को पहले व्याख्या की जानी चाहिए, और परिणाम wget को भेजा जाएगा। सूचना मैं गलत कमांड से उन्हें रोकने के लिए sed कमांड में स्थान और% चार्ट से बच गया। Wget के लिए -q विकल्प प्रोसेसिंग आउटपुट को स्क्रीन पर प्रिंट होने से रोकता है (स्क्रिप्टिंग के लिए आसान जब आप इन-वर्क स्टेटस की परवाह नहीं करते हैं) और -ओ ऑप्शन आउटपुट फाइल को निर्दिष्ट करता है। FYI करें, यदि आप आउटपुट को फ़ाइल में सहेजना नहीं चाहते हैं, लेकिन इसे टर्मिनल में देखें, तो stdout को इंगित करने के लिए फ़ाइल नाम के बजाय "-" का उपयोग करें।


3

wget भी -स्विच के साथ स्टड को स्वीकार करता है ।

यदि आप किसी फ़ाइल में आउटपुट सहेजना चाहते हैं, तो -Oस्विच का उपयोग करें।

echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g' | wget -i- -O temp.html
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.