2011-01-31 81 views
11

Tôi muốn viết một vòng lặp lồng nhau mà phải làm việc trong dấu nhắc bash shell. lồng nhau cho vòng lặp trong dòng lệnh đơn.bash shell lồng nhau cho vòng lặp

Ví dụ,

for i in a b; do echo $i; done 
a 
b 

Trong ví dụ trên, vòng lặp for được thực hiện trong một đơn đúng dòng lệnh. Như thế này tôi đã thử lồng vào vòng lặp trong dấu nhắc trình bao. Nó không hoạt động. Cách thực hiện việc này. Vui lòng cập nhật cho tôi về điều này.

+0

-bash-3.00 # for i in a b; echo $ i; thực hiện a b -bash-3.00 # – rashok

+0

trong các chú thích ở trên tôi đã đề cập để gửi lại dòng mới ... lệnh là "cho i in ab; làm echo $ i; done" – rashok

+0

Vui lòng EDIT câu hỏi của bạn, làm không thêm loại bình luận này. Tôi đã chỉnh sửa để làm nổi bật mã ... – Drakosha

Trả lời

16

Đây không phải là vòng lặp lồng nhau, chỉ một vòng lặp. Và phiên bản lồng nhau hoạt động, quá:

# for i in a b; do for j in a b; do echo $j; done; done 
a 
b 
a 
b 
+1

tôi đã thử điều này ... tôi nhận được lỗi ... "lỗi cú pháp gần mã thông báo bất ngờ 'echo'" ... tôi đang cố gắng này trong bash ... – rashok

+1

Tôi đã làm nó trong bash ... mà vỏ là bạn sử dụng? Ít nhất bạn đã gắn thẻ câu hỏi này "bash", vì vậy nó phải rõ ràng. – Daniel

+1

@ashok: Lỗi đó có thể có nghĩa là bạn đang thiếu 'do' ở đâu đó. –

21

Một một dòng (dấu chấm phẩy cần thiết):

for i in 0 1 2 3 4 5 6 7 8 9; do for j in 0 1 2 3 4 5 6 7 8 9; do echo "$i$j"; done; done 

định dạng cho mức độ dễ đọc (không có dấu chấm phẩy cần thiết):

for i in 0 1 2 3 4 5 6 7 8 9 
do 
    for j in 0 1 2 3 4 5 6 7 8 9 
    do 
     echo "$i$j" 
    done 
done 

Có các quan điểm khác nhau về cách mã trình bao nên được đặt ra trên nhiều dòng; đó là về những gì tôi thường sử dụng, trừ khi tôi đặt các hoạt động tiếp theo trên cùng một dòng như do (tiết kiệm hai dòng ở đây).

+0

Tại sao không làm điều gì đó như cho tôi trong $ (seq 0 9) thay vì viết ra mỗi số trong chuỗi? – SummerEla

+2

@SummerEla: Bạn có thể '$ (seq 0 9)'; trong Bash, bạn cũng có thể viết 'for i in {0..9}'. Có rất nhiều cách có thể được sử dụng. Ưu điểm của việc không sử dụng 'seq' là nó tiết kiệm trên các tiến trình (11 trong số chúng). Bạn không thể tìm thấy đó là một vấn đề, nhưng nó là một lý do danh nghĩa để sử dụng một trong các ký hiệu thay thế (một trong các câu trả lời, hoặc mở rộng cú đúp). Lưu ý rằng việc mở rộng cú đúp không phải là rất linh hoạt - và không phải là danh sách các số được viết ra. Ký hiệu 'seq' cho phép bạn kiểm soát phạm vi với các giới hạn biến. Tất cả phụ thuộc vào những gì bạn đang sau. –

+0

Giải thích tuyệt vời, nhờ @Johnathan Leffler – SummerEla

3
#!/bin/bash 
# loop*figures.bash 

for i in 1 2 3 4 5 # First loop. 
do 
    for j in $(seq 1 $i) 
    do 
     echo -n "*" 
    done 
    echo 
done 
echo 
# outputs 
# * 
# ** 
# *** 
# **** 
# ***** 

for i in 5 4 3 2 1 # First loop. 
do 
    for j in $(seq -$i -1) 
    do 
     echo -n "*" 
    done 
    echo 
done 

# outputs 
# ***** 
# **** 
# *** 
# ** 
# * 

for i in 1 2 3 4 5 # First loop. 
do 
    for k in $(seq -5 -$i) 
    do 
     echo -n ' ' 
    done 
    for j in $(seq 1 $i) 
    do 
     echo -n "* " 
    done 
    echo 
done 
echo 

# outputs 
#  * 
# * * 
# * * * 
# * * * * 
# * * * * * 

for i in 1 2 3 4 5 # First loop. 
do 
    for j in $(seq -5 -$i) 
    do 
     echo -n "* " 
    done 
    echo 
    for k in $(seq 1 $i) 
    do 
     echo -n ' ' 
    done 
done 
echo 

# outputs 
# * * * * * 
# * * * * 
# * * * 
# * * 
#  * 


exit 0 
+2

Vui lòng cung cấp một số giải thích ngoài mã. – Jan

Các vấn đề liên quan