Điểm:2

Tập lệnh Bash: lệnh "đọc" không phản hồi

lá cờ in

Tôi đang viết một kịch bản bash sẽ

  1. Tải xuống mã html của trang web thành tệp "index.html"
  2. Hỏi người dùng về loại tệp và tìm kiếm "index.html" để biết số loại tệp phù hợp

Đây là chức năng sẽ hoàn thành bước 2:

1. hàm findFiles() {
2. echo "Nhập loại tệp cần tìm (bao gồm '.') || Nhập EXIT để kết thúc chương trình"
3. đọc loại tệp
4.
5. while [[ "$fileType" != "EXIT" ]];
6. làm
7. nếu [[ $(grep -q $fileType index.html) = 1 ]]; sau đó
8. grep -F "$fileType" index.html >> foundFiles.txt
9. fi
10. xong
11.
12. rm index.html
13. };

Khi được thực thi, dòng 3 nhắc người dùng nhập nhưng không phản hồi khi tôi nhấn enter, ví dụ sau:

26-09-2021 12:41:06 (2,66 MB/s) - âindex.htmlâ đã lưu [94126]

Nhập loại tệp để tìm kiếm (bao gồm '.') || Gõ EXIT để kết thúc chương trình 
.pdf
.txt



foo
AAAA

Tôi đã thử khai báo một biến cục bộ $fileType đầu tiên, sử dụng đọc -p và đặt dấu chấm phẩy ở cuối dòng 3. Kết quả luôn giống nhau và tôi không thể tìm ra giải pháp. Tôi biết rằng những gì tiếp theo dòng 3 là thiếu sót, nhưng tôi chỉ muốn trợ giúp với dòng 3 vì những dòng sau đây là thứ mà tôi muốn tự mình thực hiện để tìm hiểu thêm về cách viết mã bash.

Bất kỳ ý tưởng được đánh giá cao.

muru avatar
lá cờ us
Hãy cho chúng tôi biết bạn đang thực hiện chức năng này như thế nào.
Điểm:4
lá cờ cn

Nó không được phép trả lời. Nó đang làm chính xác những gì nó nên làm: nó đọc đầu vào và gán nó cho biến loại tệp. Tuy nhiên, sau đó bạn có một trong khi vòng lặp đang kiểm tra giá trị của một biến không bao giờ thay đổi:

while [[ "$fileType" != "EXIT" ]];

Vì giá trị của $fileType chỉ được đặt một lần và trước trong khi vòng lặp, đó trong khi trở thành một vòng lặp vô tận trừ khi bạn vượt qua LỐI RA trong lần thử đầu tiên. Trong mọi trường hợp, tập lệnh của bạn sẽ không hoạt động vì đầu ra của tệp mẫu grep -q sẽ không bao giờ được 1. Trên thực tế, nó sẽ luôn trống vì đó là những gì grep -q làm. Tôi nghi ngờ bạn muốn kiểm tra trạng thái thoát của lệnh nhưng, ngay cả điều đó cũng vô nghĩa: không có lợi gì khi đọc toàn bộ tệp một lần với grep -q chỉ để sau đó đọc lại tất cả với grep -F.

Đây là một phiên bản làm việc của chức năng của bạn:

hàm findFiles() {
  while [[ "$fileType" != "EXIT" ]];
  làm
    echo "Nhập loại tệp cần tìm (bao gồm '.') || Nhập EXIT để kết thúc chương trình"
    đọc loại tệp
    grep -F "$fileType" index.html >> foundFiles.txt
  xong
     rm chỉ mục.html
 };

Hoặc, nếu bạn muốn tránh tạo một ô trống tìm thấyFiles.txt nếu không tìm thấy kết quả phù hợp, bạn có thể thử:

hàm findFiles() {
  while [[ "$fileType" != "EXIT" ]];
  làm
    echo "Nhập loại tệp cần tìm (bao gồm '.') || Nhập EXIT để kết thúc chương trình"
    đọc loại tệp
    nếu grep -qm1 "$fileType" index.html; sau đó
      grep -F "$fileType" index.html >> foundFiles.txt
    fi
  xong
     rm chỉ mục.html
 };

Các -m đảm bảo tiếng kêu thoát sau lần khớp đầu tiên, do đó bạn không cần phải đọc toàn bộ tệp hai lần. Lưu ý cách tôi không sử dụng lệnh thay thế ($(lệnh)) vì tôi đang kiểm tra xem lệnh đã thành công chưa và không cố sử dụng đầu ra của nó.

Bubbles avatar
lá cờ in
Đúng! Cảm ơn bạn, điều này đã khắc phục sự cố của tôi và tôi hiểu giải pháp của bạn, điều này giúp tôi rất nhiều. Tôi sẽ làm việc với kịch bản để đảm bảo rằng nó thực hiện chính xác những gì tôi đang cố gắng thực hiện.
Điểm:1
lá cờ cn

Bạn dường như đang bắt mình trong một vòng lặp vô tận. Nếu người dùng không gõ "EXIT", thì trong khi vòng lặp sẽ tiếp tục mãi mãi. Bất kỳ văn bản bổ sung nào bạn nhập sẽ được lặp lại tới thiết bị đầu cuối.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.