ทีละบรรทัดไม่ทำงาน


1

ต้นฉบับ

FILE="/u0146121/bin/list.txt"
while read line; do 
echo $line 
done < $FILE

ฉันยังใหม่กับการทุบตีสคริปต์และพยายามคิดสิ่งนี้ในขณะที่วนรอบ ฉันต้องการอ่านทีละบรรทัดจากไฟล์ข้อความแล้วทำคำสั่ง

ฉันได้รับข้อผิดพลาด:

 No such file or directory121/bin/list.txt

ใครบ้างรู้วิธีแก้ไขปัญหานี้หรือไม่


1
คุณลองเพิ่มวินาทีechoหลังจากครั้งแรกหรือไม่? echo $line; echo. มันจะไม่แก้ปัญหาของคุณ แต่อาจช่วยให้คุณเห็นข้อความผิดพลาดแบบเต็ม ฉันไม่เห็นอะไรผิดปกติกับสคริปต์ของคุณนอกเหนือจากชื่อไฟล์
CVn

จะเกิดอะไรขึ้นถ้าคุณเปลี่ยนสาย shebang ด้วย#!/bin/bash -x? ( -xและ-vเปิดใช้งานข้อมูลการแก้ไขข้อบกพร่องเพิ่มเติม)
Hennes

คำตอบ:


3

ฉันสงสัยว่าสคริปต์ของคุณอาจมีการสิ้นสุดบรรทัดแบบ DOS ใน DOS (และ Windows) แต่ละบรรทัดของไฟล์ข้อความจะจบลงด้วยการขึ้นบรรทัดใหม่ ( แทนอย่างหลากหลาย\rหรือ^M) ตามด้วย linefeed ( \nหรือ^J) ในทางตรงกันข้ามไฟล์ข้อความ Unix จะจบแต่ละบรรทัดด้วยการป้อนบรรทัด หากคุณให้เครื่องมือ unix (เช่นทุบตี) ไฟล์ที่ฟอร์แมตด้วย DOS มันจะตีความการปัดแคร่เป็นส่วนหนึ่งของบรรทัดและสับสนมาก ในกรณีนี้ดูเหมือนว่าไฟล์ของฉันจะถูกตั้งค่าเป็นจริง/u0146121/bin/list.txt^Mซึ่งไม่มีอยู่จริงและเมื่อเชลล์รายงานปัญหาว่าการส่งคืนสินค้าสร้างความสับสนให้กับเทอร์มินัลและเมื่อสิ้นสุดข้อความแสดงข้อผิดพลาด

หากต้องการตรวจสอบลองพิมพ์สคริปต์ของคุณด้วยcat -v /path/to/script- หากคุณเห็น ^ M ที่ท้ายบรรทัดคุณมีไฟล์รูปแบบ DOS ระบบของคุณอาจมีคำสั่งให้แปล แต่ชื่อคำสั่งนั้นแตกต่างกันไป (เช่นอาจเป็นdos2unixหรือfromdosหรือ ... ) หากคุณไม่พบคำสั่งที่เกี่ยวข้องคุณสามารถใช้สคริปต์ Perl นี้เล็กน้อย:

perl -pi -e 's/\r//g' /path/to/script

คุณพูดถูกมันมี ^ M
mkrouse

0

คุณอาจไม่แสดงให้เราเห็นว่าคุณกำลังทำอะไรอยู่ ข้อความแสดงข้อผิดพลาดคือ

No such file or directory121/bin/list.txt

ซึ่งแสดงให้เห็นว่า$FILEมี121/bin/list.txtแทน/u0146121/bin/list.txtดังนั้นฉันสามารถเดาว่าคุณไม่ได้ทำงานจริงแต่FILE="/u0146121/bin/list.txt"FILE="121/bin/list.txt"

ไม่ว่าในกรณีใดลองเรียกใช้โดยไม่กำหนดตัวแปรเพื่อดูว่าทำงานได้หรือไม่:

while read line; do 
  echo $line;
done < /u0146121/bin/list.txt

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