2012-03-19 34 views
10

tôi thường xuyên viết thư cho-vòng trong bash với cú pháp nổi tiếng:Viết một bash cho vòng lặp với một biến đầu-end

for i in {1..10} [...] 

Bây giờ, tôi đang cố gắng để viết một trong những nơi đầu là được xác định bởi một biến:

TOP=10 
for i in {1..$TOP} [...] 

Tôi đã thử nhiều loại dấu ngoặc, dấu ngoặc nhọn, đánh giá, v.v ... và thường lấy lại lỗi "thay thế kém".

Làm cách nào để viết vòng lặp for để giới hạn phụ thuộc vào biến thay vì giá trị mã hóa cứng?

+0

thể trùng lặp của [Làm thế nào để lặp qua một loạt các số trong bash?] (http://stackoverflow.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-in-bash) – l0b0

Trả lời

21

Bạn có thể sử dụng cho vòng lặp như thế này để lặp với một biến $TOP:

for ((i=1; i<=$TOP; i++)) 
do 
    echo $i 
    # rest of your code 
done 
8

Nếu bạn có một hệ thống gnu, bạn có thể sử dụng seq để tạo ra các chuỗi khác nhau, bao gồm này.

for i in $(seq $TOP); do 
    ... 
done 
+0

'seq' là không được khuyến khích trong việc mở rộng cú đúp. Hành vi giữa bsd/gnu không hoàn toàn giống nhau. – Daenyth

+0

@daenyth tốt cần lưu ý khi mở rộng cú đúp là một giải pháp khả thi, nhưng toàn bộ điểm của câu hỏi này là việc mở rộng cú đúp không hoạt động với các giới hạn biến. – Kevin

1

trả lời một phần là there: xem Ví dụ 11-12. Kiểu C cho vòng lặp.

Dưới đây là một bản tóm tắt từ đó, nhưng lưu ý là câu trả lời cuối cùng cho câu hỏi của bạn phụ thuộc vào dịch bash của bạn (/bin/bash --version):

# Standard syntax. 
for a in 1 2 3 4 5 6 7 8 9 10 

# Using "seq" ... 
for a in `seq 10` 

# Using brace expansion ... 
# Bash, version 3+. 
for a in {1..10} 

# Using C-like syntax. 
LIMIT=10 
for ((a=1; a <= LIMIT ; a++)) # Double parentheses, and "LIMIT" with no "$". 

# another example 
lines=$(cat $file_name | wc -l) 
for i in `seq 1 "$lines"` 

# An another more advanced example: looping up to the last element count of an array : 
for element in $(seq 1 ${#my_array[@]}) 
Các vấn đề liên quan