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 ### Tilde expansion within for loop
31 HOME=/home/bob
32 for name in ~/src ~/git; do
33 echo $name
34 done
35 # stdout-json: "/home/bob/src\n/home/bob/git\n"
36
37 ### Brace Expansion within Array
38 for i in -{a,b} {c,d}-; do
39 echo $i
40 done
41 # stdout-json: "-a\n-b\nc-\nd-\n"
42 # N-I dash stdout-json: "-{a,b}\n{c,d}-\n"
43
44 ### using loop var outside loop
45 func() {
46 for i in a b c; do
47 echo $i
48 done
49 echo $i
50 }
51 func
52 # stdout-json: "a\nb\nc\nc\n"
53
54 ### continue
55 for i in a b c; do
56 echo $i
57 continue
58 echo $i
59 done
60 # stdout-json: "a\nb\nc\n"
61
62 ### break
63 for i in a b c; do
64 echo $i
65 break
66 done
67 # stdout: a
68
69 ### while in while condition
70 # This is a consequence of the grammar
71 while while true; do echo cond; break; done
72 do
73 echo body
74 break
75 done
76 # stdout-json: "cond\nbody\n"
77
78 ### while in pipe
79 i=0
80 find tests/ | while read $path; do
81 i=$((i+1))
82 #echo $i
83 done
84 # This Because while loop was in a subshell
85 echo $i
86 # stdout: 0
87
88 ### while in pipe with subshell
89 i=0
90 find bin/ -type f | ( while read path; do
91 i=$((i+1))
92 #echo $i
93 done
94 echo $i )
95 # stdout: 1
96
97 ### until loop
98 # This is just the opposite of while? while ! cond?
99 until false; do
100 echo hi
101 break
102 done
103 # stdout: hi