2011-12-20 33 views
10

Có hai cách đọc một dòng tập tin bằng cách dòng mà tôi muốn thảo luận ở đây:Bash trong khi vòng lặp mà đọc dòng tập tin bằng dòng

#!/bin/bash  

while read line  
do  
    echo-e "$ line \ n"  
done <file.txt 

#!/bin/bash  
exec 3<file.txt 

while read line  
do  
    echo-e "$ line \ n"  
done 

phiên bản Vì vậy, đầu tiên hoạt động tốt nhưng tôi không hiểu cơ chế làm việc trong khi lặp lại với tệp. Nhưng cơ chế của phiên bản thứ hai tôi hiểu. Nhưng ở đây tôi không hiểu tại sao nó treo và không in bất cứ thứ gì.

Trả lời

9

Vòng lặp đầu tiên hoạt động vì chuyển hướng sau done áp dụng cho toàn bộ vòng lặp, do đó, read có đọc từ tệp, không phải từ đầu vào chuẩn của tập lệnh.

Phiên bản thứ hai bị treo vì read đọc từ bộ mô tả tệp 0, là đầu vào tiêu chuẩn và bạn chưa nhập bất kỳ thứ gì ở đó. Dòng exec chuyển hướng tập tin mô tả 3 để đọc từ tập tin, nhưng bạn không đọc từ mô tả tập tin 3.

Bạn có thể giải cứu thứ hai bằng cách sử dụng:

exec <file.txt 

đầu vào Bây giờ tiêu chuẩn được đọc từ tệp được đặt tên.

3

Có vài lỗi trong tập lệnh của bạn.

  1. Không gian giữa $ và tên biến. (có thể chỉnh sửa không tốt)
  2. Khoảng cách giữa echo-e. (có thể là chỉnh sửa xấu)
  3. Đề cập đến phần đọc tại bộ mô tả tệp nơi tệp đang mở. Bạn đang đọc tập tin tại descriptor 0 và exec đang chạy ở mô tả 3.

Nó phải là một cái gì đó như thế này -

#!/bin/bash  
exec 3<file.txt 

while read line 
do 
    echo -e "$line \n" 
done <&3 
+1

Liệu '<& ​​3' trên' tác dòng read'? Nó từng là trường hợp, trở lại trong những ngày cũ xấu của vỏ Bourne thực sự, việc chuyển hướng sẽ được thực hiện mỗi lần vòng lặp, vì vậy bạn có các hiệu ứng vui nhộn (giống như tệp được đóng trên mỗi lần lặp). Tôi cũng có thể tin rằng nó đã được sửa đổi kể từ đó để mọi thứ hoạt động tốt hơn một chút. * FWIW *: khi tôi thử 'bash' trên MacOS X, với:' while read line

+0

Cảm ơn Jon, tôi đã thử với kịch bản trên, nó hoạt động trên mac của tôi. http://cl.ly/ClDf nhưng đó là một số thông tin hữu ích. Tôi nhớ nó. Tôi vẫn còn rất nhiều mới để bash.Vừa học 'awk' và' sed'. Nhưng sẽ bắt đầu một số cuốn sách về cơ bản bash. :) –

+0

Đã chỉnh sửa câu trả lời để có '<& 3' sau câu lệnh' done' thay vì câu lệnh 'read'. –

4

Điều này có thể làm việc cho bạn:

exec 3<file.txt 

while read -u3 line 
do 
    echo -e "$line \n" 
done 

-u3 đọc từ bộ mô tả tập tin 3

Lạ rằng echo không có công cụ chuyển đổi bổ sung e ksh's print lệnh.

0

-u3 là rất tốt cho mục đích của tôi (đọc chỉ dòng sau)

#!/bin/bash 

logs=(*Logs.txt) 
[[ -e "${logs[0]}" ]] || exit 0 

exec 3<"${logs[0]}" 

while read -u3 line 
do 
     if [[ $(echo "$line"| grep -c SCSI_STATUS_CHECK_CONDITION) -eq 1 ]]; then 
       read -u3 line 
       echo "$line" 
     fi 
done 
Các vấn đề liên quan