เครื่องหมายคำพูดเดี่ยวและตัวแปรภายในเชลล์เบิร์น


1

ฉันมีคำสั่งนี้ที่ฉันพยายามที่จะดำเนินการในเปลือก bourne สำหรับ Solaris 9

find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | ${PARSEDATA}' {} \; >> ${TMP_1}

ปัญหาของฉันคือตัวแปร${PARSEDATA}ทำงานไม่ถูกต้องฉันลองใช้เครื่องหมายคำพูดคู่ล้อมรอบมันแล้วปัญหาคือ$0ชื่อของสคริปต์ที่ใช้รหัสนี้ไม่ใช่ไฟล์ที่ใช้findคำสั่ง

ข้อเสนอแนะใด ๆ ในการแก้ปัญหานี้อาจเป็นปัญหาง่ายมีประโยชน์อย่างมาก

ขอบคุณล่วงหน้า.

อัปเดต: $0เป็นชื่อของสคริปต์ที่ใช้findคำสั่งตัวแปรสำหรับ${PARSEDATA}เป็นตัวกรองอยู่ที่ใดที่หนึ่งในระบบที่ปรับเปลี่ยนเอาต์พุตของสคริปต์ที่พบแต่ละรายการ อย่างไรก็ตามปัญหาคือฉันไม่สามารถรับทั้งสอง$0และ${PARSEDATA}ขยายอย่างถูกต้อง$0ขยายได้ดีโดยใช้อัญประกาศเดียวหรือใช้ double qoutes ${PARSEDATA}ขยายดี แต่จากนั้น$0กลายเป็นชื่อของสคริปต์ต้นฉบับที่รันfindคำสั่งนี้


มันจะช่วยถ้าคุณอธิบายสิ่งที่คุณคาดหวังว่าคำสั่งนี้จะประสบความสำเร็จโดยเฉพาะอย่างยิ่งสิ่งที่ $ 0 และ PARSEDATA
jlliagre

@jlliagre ชัดเจนเพียงพอหรือไม่
user32178

คำตอบ:


0

ฉันไม่แน่ใจว่าคุณกำลังพยายามทำอะไร? แต่ถ้าคุณต้องการที่จะมองหาสคริปต์ชื่อ check_ * แล้วเรียกใช้และท่อผ่านโปรแกรม $ {} PARSE_DATA ดีผมคิดว่าไฟล์อยู่โดยหาไม่ได้$0แต่{}

ตัวอย่าง

ค้นหา / var / ftp / mp3 -name "* .mp3" -type f -exec chmod 644 {} \; (วิกิพีเดีย)

ดังนั้นฉันคิดว่าคุณสามารถใช้เครื่องหมายคำพูดคู่ของคุณ:

find ${DATADIR} -name "check_*" -type f -exec sh -c '{} | ${PARSEDATA}' \; >> ${TMP_1}

ฉันพยายามเรียบร้อยแล้ว:

PG='sed s/Blah/Bleh/'
find . -name "check_*" -type f -exec sh -c "{} | $PG" \;

> Bleh Blah

คุณได้ตรวจสอบแล้วshไม่ใช่แค่ symlink ต่อbashและคุณไม่ได้ใช้ GNU findหรือไม่
user32178

อันที่จริงแล้วมันเป็น symlink ไปที่ / bin / dash ... อะไรคือจุดที่เรียกมันว่า sh แล้ว ประณามมัน แต่ดูเหมือนว่าจะเป็น GNU ค้นหาโดยวิธี
M'vy

โอ้เพียงแค่อยากรู้อยากเห็น: ตัวอย่างของฉันทำอะไรกับ SH บริสุทธิ์ของคุณ?
M'vy

เป็นเพราะต้องมี/bin/shไบนารีที่เข้ากันได้กับเชลล์เป้าหมาย
grawity

0

เก็บเครื่องหมายคำพูดเดี่ยวปัญหาน่าจะเป็นคุณยังไม่ได้ส่งออกตัวแปร PARSEDATA

export PARSEDATA
find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | ${PARSEDATA}' {} \; >> ${TMP_1}

0

หากคุณต้องการให้ $ 0 ไม่ถูกขยายโดยเชลล์ (ใช้เครื่องหมายคำพูดเดี่ยว) และ $ {PARSEDATA} จะถูกขยายออกไปทำไมไม่ใช้คำพูดที่แตกต่างกันสำหรับแต่ละรายการ:

find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | '"${PARSEDATA}" {} \; >> ${TMP_1}

ตราบใดที่คุณให้ชิ้นส่วนที่ยกมารวมอยู่ด้วยเชลล์จะขยาย $ {PARSEDATA} และส่งคำสั่งทั้งหมดเป็นโทเค็นเดียวเพื่อค้นหา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.