ไฟล์มีอยู่ไม่ทำงานในสคริปต์ที่คาดหวัง


1

ฉันพยายามตรวจสอบว่ามีบรรทัดใดบรรทัดหนึ่งอยู่ในชื่อไฟล์ของโฮสต์หรือไม่ ดังนั้นหากพบรูปแบบเฉพาะจากคำสั่ง grep dummy.txt จะถูกสร้างขึ้น จากนั้นฉันต้องการตรวจสอบว่า dummy.txt มีเงื่อนไขและดำเนินการต่อหรือไม่

แต่แม้ว่า dummy.txt จะถูกสร้างขึ้นโดยไม่พบคำสั่ง if:

if {[file exists $fileName] }

และการควบคุมจะถูกโอนไปยังบล็อกอื่น อะไรคือเหตุผล? มีวิธีใดที่ง่ายกว่าในการบรรลุสิ่งที่ฉันต้องการหรือไม่

 set Host [lindex $argv 0 ]
 spawn ssh -o StrictHostKeyChecking=no userid@$Host
 expect "*assword*"
 send "password\n"
 expect "+"
 send "cd path/that/contains/filename\n"
 expect "*$*"
 send "pwd\n"
 set fileName dummy.txt
 send {grep '\[abc\]' filename | wc -l | { read line; [ "$line" != "0" ] && echo "$line"> dummy.txt; }}
 send "\n"
 expect "+"
 send {grep 'xyz' filename | wc -l | { read line; [ "$line" != "0" ] && echo "$line"> dummy.txt; }}
 send "\n"
 expect "+"
 send "chmod 777 dummy.txt\n"
 if {[file exists $fileName] } {

   send {printf "\nabc xyz already exists"} 
   send "\n"
   expect "+"
   send "ls -l\n"
   expect "+"
   send "rm dummy.txt\n"
   expect "+"
   send "ls -l\n"
   expect "+"
        send "exit\n"
  } else {
        send {printf "cannot find $fileName"}
   send "\n"
   expect "+"
   send {printf "\n[abc]\nxyz\n" >> filename}
   send "\n"
   expect "+"
   send "cat filename\n"
   expect "+"
    send "exit\n"

    }

แทนสิ่งนี้ wc | read ... คุณสามารถตรวจสอบรหัสส่งคืนของ grep ได้ (0 = พบข้อมูลตรงกันดู man grep )
ott--

คำตอบ:


1

if {[file exists $fileName] } จะตรวจสอบว่ามีไฟล์อยู่ในระบบโลคัลหรือไม่ (หนึ่งที่ expect กำลังทำงาน) แต่ไฟล์ที่สร้างขึ้นตามเงื่อนไขจะอยู่ในโฮสต์ระยะไกล (อันที่สคริปต์เข้าสู่ระบบด้วย ssh ) ถ้ามันมีอยู่ นอกจากนี้ filename คือ dummyแต่ไฟล์ที่สร้างขึ้นแบบมีเงื่อนไขคือ dummy.txt.


ขออภัยสกอตต์ที่เป็นตัวพิมพ์ผิด มัน dummy.txt ทุกที่ หากการตรวจสอบบนเครื่องระยะไกลแล้วฉันจะได้รับการตรวจสอบในโฮสต์ได้อย่างไร ฉันพยายามทำให้กระบวนการเพิ่มบรรทัดเฉพาะลงในไฟล์โดยอัตโนมัติ แต่ในเวลาเดียวกันถ้ามีบรรทัดเหล่านั้นอยู่แล้วฉันไม่ต้องการรายการที่ซ้ำกันซึ่งเป็นสาเหตุที่ฉันใช้ grep และ dummy.txt
user417721

ขอบคุณสำหรับการแก้ไขข้อผิดพลาดในคำถาม แต่ตราบใดที่คุณแก้ไขคำถามคุณควรทำให้ชัดเจนขึ้น ฉันไม่เข้าใจความคิดเห็นของคุณอย่างเต็มที่ หากคุณต้องการทำบางสิ่งอย่างมีเงื่อนไขบนรีโมตโฮสต์ตามเงื่อนไขบนรีโมตโฮสต์ให้คิดว่ามันเป็นเชลล์สคริปต์และใช้โลจิคัลเชลล์ เช่น., send {grep -q xyz filename || echo xyz >> filename}.
Scott

ฉันต้องการที่จะเพิ่มเนื้อหาพูด xyz abc ไปยังชื่อไฟล์บนรีโมตโฮสต์ แต่ฉันต้องการตรวจสอบว่า xyz abc เหล่านั้นมีอยู่แล้วในชื่อไฟล์ เพื่อตรวจสอบสิ่งนี้ฉันใช้ send ชื่อไฟล์ {grep '[abc]' wc -l | {อ่านบรรทัด; ["$ line"! = "0"] & amp; & amp; echo "$ line" & gt; dummy.txt; }} ส่ง "\ n" คาดหวัง "+" ส่ง {grep 'xyz' ชื่อไฟล์ | wc -l | {อ่านบรรทัด; ["$ line"! = "0"] & amp; & amp; echo "$ line" & gt; dummy.txt; }} ส่ง "\ n" ดังนั้นหาก xyz abc อยู่ในชื่อไฟล์จะมีการสร้างไฟล์ dummy.txt ใหม่ ดังนั้นหาก dummy.txt อยู่บนรีโมทหมายความว่า xyz และ abc แสดงในชื่อไฟล์และสคริปต์ไม่จำเป็นต้องเพิ่มอีก
user417721

ฉันรู้ว่ามันดูยาวไปหน่อย แต่ฉันก็ไม่สามารถนึกถึงวิธีที่ง่ายกว่าในการทำสิ่งนี้ให้สำเร็จตั้งแต่ฉันใช้การโต้ตอบ หากคุณสามารถแนะนำวิธีแก้ปัญหาเพื่อตรวจสอบไฟล์บนรีโมตโฮสต์หรือวิธีที่ง่ายกว่าในการทำให้สิ่งทั้งหมดนี้ใช้ได้ดี :)
user417721

send {[ -f dummy.txt ] && echo "xyz abc" >> filename}. หรืออ่านความคิดเห็นล่าสุดของฉันอีกครั้ง
Scott
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.