Làm thế nào để tạo một vòng lặp for trong dòng lệnh?


22

Hãy đơn giản for loop

#!/bin/bash

for i in `seq 1 10`;
do
    echo $i
done

Dấu chấm phẩy AFAIK trong các tập lệnh bash làm cho shell thực thi lệnh hiện tại một cách đồng bộ và sau đó chuyển sang lệnh tiếp theo. Nhấn enter thực sự giống nhau ngoại trừ việc nó không cho phép bạn nhập lệnh sau, xóa bộ đệm ngay lập tức.

Vậy tại sao shell không thể giải thích dòng sau

for i in `seq 1 10`; do; echo $i; done

Làm thế nào điều này for loopthực sự hoạt động?

Câu trả lời:


16

Cú pháp của một forvòng lặp từ bashtrang hướng dẫn là

for name [ [ in [ word ... ] ] ; ] do list ; done

Dấu chấm phẩy có thể được thay thế bằng trả về vận chuyển, như đã lưu ý ở nơi khác trong bashtrang hướng dẫn: "Một chuỗi gồm một hoặc nhiều dòng mới có thể xuất hiện trong danh sách thay vì dấu chấm phẩy để phân định các lệnh."

Tuy nhiên, ngược lại là không đúng sự thật; bạn không thể tùy ý thay thế dòng mới bằng dấu chấm phẩy. Tập lệnh multiline của bạn có thể được chuyển đổi thành một dòng miễn là bạn tuân thủ các quy tắc cú pháp ở trên và không chèn thêm dấu chấm phẩy sau do:

for i in `seq 1 10`; do echo $i; done

2
Kịch bản cuối cùng là sai, như @ dr01 đã chỉ ra, bạn cần xóa dấu chấm phẩy sau do.
Jake

1
@jake, điều này cũng nói bạn phải xóa dấu chấm phẩy sau do. Ngoài ra, câu trả lời này giải thích lý do tại sao bạn phải xóa dấu chấm phẩy sau khi 'làm'.
user4556274 17/03/18

Điều gì nếu $icần phải là một phần của tên tập tin? Có cần báo giá gấp đôi?
Ẩn danh

18

Dấu chấm phẩy sau dolà một lỗi và không nên ở đó.

Sau đây hoạt động chính xác:

for i in `seq 1 10`; do echo $i; done 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.