1 ## our_shell: ysh
2
3 #### For loop over expression: List
4 var mylist = [1, 2, 3]
5 for item in (mylist) {
6 echo "item $item"
7 }
8
9 ## STDOUT:
10 item 1
11 item 2
12 item 3
13 ## END
14
15 #### For loop over expression: Dict, not BashAssoc
16
17 var mydict = {name: 'bob', age: 40}
18 for key in (mydict) {
19 echo "key $key"
20 }
21
22 declare -A A=([name]=bob)
23 for key in (A) {
24 echo "key $key"
25 }
26
27 ## status: 3
28 ## STDOUT:
29 key name
30 key age
31 ## END
32
33
34 #### For loop over expression: range (low priority)
35 var myrange = 0:3
36 for i in (myrange) {
37 echo "i $key"
38 }
39
40 ## STDOUT:
41 i 0
42 i 1
43 i 2
44 ## END
45
46 #### Shell for loop with index (equivalent of enumerate())
47 for i, item in a b c {
48 echo "$i $item"
49 }
50 ## STDOUT:
51 0 a
52 1 b
53 2 c
54 ## END
55
56 #### 3 indices with (mylist) is a runtime error
57 for i, item bad in (['foo', 'bar']) {
58 echo "$i $item $bad"
59 }
60 ## status: 2
61
62 #### Shell for loop can't have 3 indices
63 for i, bad, bad in a b c {
64 echo $i $item
65 }
66 ## status: 2
67
68 #### Any for loop can't have 4 indiecs
69 for a, b, c, d in (['foo']) {
70 echo $i $item
71 }
72 ## status: 2
73
74 #### Expression for loop with index: List
75 for i, item in (['spam', 'eggs']) {
76 echo "$i $item"
77 }
78 ## STDOUT:
79 0 spam
80 1 eggs
81 ## END
82
83 #### Expression for loop with index: Dict (TODO: define dict iter order)
84 for key, value in ({name: 'bob', age: 40}) {
85 echo "pair $key $value"
86 }
87 ## STDOUT:
88 pair name bob
89 pair age 40
90 ## END
91
92 #### Dict: index key value loop (TODO: define dict iter order)
93 for i, key, value in ({name: 'bob', age: 40}) {
94 echo "entry $i $key $value"
95 }
96 ## STDOUT:
97 entry 0 name bob
98 entry 1 age 40
99 ## END
100
101
102 #### Equivalent of zip()
103
104 var array = :| d e f |
105
106 for i, item in a b c {
107 echo "$i $item $[array[i]]"
108 }
109
110 ## STDOUT:
111 0 a d
112 1 b e
113 2 c f
114 ## END
115
116 #### parse_bare_word eliminates confusion
117
118 shopt --unset parse_bare_word
119
120 for x in mylist { # THIS FAILS
121 echo "BAD $x"
122 }
123
124 ## status: 2
125 ## STDOUT:
126 ## END
127
128
129 #### Object that's not iterable
130
131 echo hi
132 for x in (42) {
133 echo $x
134 }
135
136 ## status: 3
137 ## STDOUT:
138 hi
139 ## END
140
141 #### Oil for with brace substitution and glob
142
143 touch {foo,bar}.py
144 for i, file in *.py {README,foo}.md {
145 echo "$i $file"
146 }
147 ## STDOUT:
148 0 bar.py
149 1 foo.py
150 2 README.md
151 3 foo.md
152 ## END