วิธีการส่งออกของคำสั่งหนึ่งเป็นอาร์กิวเมนต์บรรทัดคำสั่งไปยังอีก?


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

สำหรับการดีบักบางอย่างเช่นนี้การตรวจสอบค่าตัวแปรของคุณ (โดย echo-ing ไปยังเทอร์มินัล) มักจะนำคุณไปสู่การแก้ปัญหาอย่างรวดเร็ว
kasterma

คำตอบ:


47

คุณสามารถใช้ 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 จะไม่แยก stdin ของมันออกเป็นสองคำสั่งของ Comman ("cat" ในตัวอย่างด้านบน)


ฉันมาที่นี่เพราะฉันจำชื่อคำสั่งนี้ไม่ได้ กรณีการใช้งานที่ฉันชอบคือ: 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

ดูเหมือนว่าคุณสามารถใช้ชุดคำตอบที่นี่ได้ ฉันเดาว่าคุณต้องการแทนที่ช่องว่างด้วยค่า ascii ที่ถูกใช้งานใน url ในการทำเช่นนี้คุณต้องแทนที่ด้วย "% 20" ไม่ใช่แค่ "%" นี่คือทางออกที่ควรให้คำตอบที่สมบูรณ์:

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

backticks บ่งชี้ว่าคำสั่งที่ล้อมรอบควรถูกตีความก่อนและผลลัพธ์ที่ส่งไปยัง wget สังเกตุฉันหลบหนีพื้นที่และตัวอักษร% ในคำสั่ง sed เพื่อป้องกันไม่ให้ถูกตีความผิด ตัวเลือก -q สำหรับ wget ป้องกันการประมวลผลเอาต์พุตจากคำสั่งที่พิมพ์ไปที่หน้าจอ (สะดวกสำหรับการเขียนสคริปต์เมื่อคุณไม่สนใจสถานะการทำงาน) และตัวเลือก -O จะระบุไฟล์เอาต์พุต หากคุณไม่ต้องการบันทึกผลลัพธ์ไปยังไฟล์ แต่เพียงแค่ดูในเทอร์มินัลให้ใช้ "-" แทนชื่อไฟล์เพื่อระบุ stdout


3

wget ยังรับ stdin ด้วย-สวิตช์

หากคุณต้องการบันทึกผลลัพธ์ในไฟล์ให้ใช้-Oสวิตช์

echo http://maps.google.be/maps?saddr\=$1\&daddr\=$2 | sed 's/ /%/g' | wget -i- -O temp.html
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.