1 #!/bin/bash
2
3 ### implicit for loop
4 # This is like "for i in $@".
5 func() {
6 for i; do
7 echo $i
8 done
9 }
10 func 1 2 3
11 # stdout-json: "1\n2\n3\n"
12
13 ### empty for loop (has "in")
14 set -- 1 2 3
15 for i in ; do
16 echo $i
17 done
18 # stdout-json: ""
19 # BUG mksh stdout-json: "1\n2\n3\n"
20
21 ### for loop with invalid identifier
22 # should be compile time error, but runtime error is OK too
23 for - in a b c; do
24 echo hi
25 done
26 # stdout-json: ""
27 # status: 2
28 # OK bash/mksh status: 1
29
30 ### using loop var outside loop
31 func() {
32 for i in a b c; do
33 echo $i
34 done
35 echo $i
36 }
37 func
38 # stdout-json: "a\nb\nc\nc\n"
39
40 ### continue
41 for i in a b c; do
42 echo $i
43 continue
44 echo $i
45 done
46 # stdout-json: "a\nb\nc\n"
47
48 ### break
49 for i in a b c; do
50 echo $i
51 break
52 done
53 # stdout: a
54
55 ### while in while condition
56 # This is a consequence of the grammar
57 while while true; do echo cond; break; done
58 do
59 echo body
60 break
61 done
62 # stdout-json: "cond\nbody\n"
63
64 ### while in pipe
65 i=0
66 find tests/ | while read $path; do
67 i=$((i+1))
68 #echo $i
69 done
70 # This Because while loop was in a subshell
71 echo $i
72 # stdout: 0
73
74 ### while in pipe with subshell
75 i=0
76 find bin/ -type f | ( while read path; do
77 i=$((i+1))
78 #echo $i
79 done
80 echo $i )
81 # stdout: 1
82
83 ### until loop
84 # This is just the opposite of while? while ! cond?
85 until false; do
86 echo hi
87 break
88 done
89 # stdout: hi