1 #### or short circuits
2 shopt -s ysh:upgrade
3
4 var x = [1, 2]
5 if (true or x[3]) {
6 echo OK
7 }
8 ## STDOUT:
9 OK
10 ## END
11
12 #### and short circuits
13 shopt -s ysh:upgrade
14
15 var x = [1, 2]
16 if (false and x[3]) {
17 echo bad
18 } else {
19 echo OK
20 }
21
22 ## STDOUT:
23 OK
24 ## END
25
26 #### not operator behaves like Python
27
28 # consistent with if statement, ternary if, and, or
29
30 pp test_ (not "s")
31 pp test_ (not 3)
32 pp test_ (not 4.5)
33 pp test_ (not {})
34 pp test_ (not [])
35 pp test_ (not false)
36 pp test_ (not true)
37
38 ## STDOUT:
39 (Bool) false
40 (Bool) false
41 (Bool) false
42 (Bool) true
43 (Bool) true
44 (Bool) true
45 (Bool) false
46 ## END
47
48 #### not, and, or
49
50 var a = not true
51 echo $a
52 var b = true and false
53 echo $b
54 var c = true or false
55 echo $c
56
57 ## STDOUT:
58 false
59 false
60 true
61 ## END
62
63
64 #### and-or chains for typed data
65
66 python2 -c 'print(None or "s")'
67 python2 -c 'print(None and "s")'
68
69 python2 -c 'print("x" or "y")'
70 python2 -c 'print("x" and "y")'
71
72 python2 -c 'print("" or "y")'
73 python2 -c 'print("" and "y")'
74
75 python2 -c 'print(42 or 0)'
76 python2 -c 'print(42 and 0)'
77
78 python2 -c 'print(0 or 42)'
79 python2 -c 'print(0 and 42)'
80
81 python2 -c 'print(0.0 or 0.5)'
82 python2 -c 'print(0.0 and 0.5)'
83
84 python2 -c 'print(["a"] or [])'
85 python2 -c 'print(["a"] and [])'
86
87 python2 -c 'print({"d": 1} or {})'
88 python2 -c 'print({"d": 1} and {})'
89
90 python2 -c 'print(0 or 0.0 or False or [] or {} or "OR")'
91 python2 -c 'print(1 and 1.0 and True and [5] and {"d":1} and "AND")'
92
93 echo ---
94
95 json write (null or "s")
96 json write (null and "s")
97
98 echo $["x" or "y"]
99 echo $["x" and "y"]
100
101 echo $["" or "y"]
102 echo $["" and "y"]
103
104 echo $[42 or 0]
105 echo $[42 and 0]
106
107 echo $[0 or 42]
108 echo $[0 and 42]
109
110 echo $[0.0 or 0.5]
111 echo $[0.0 and 0.5]
112
113 pp test_ (["a"] or [])
114 pp test_ (["a"] and [])
115
116 pp test_ ({"d": 1} or {})
117 pp test_ ({"d": 1} and {})
118
119 echo $[0 or 0.0 or false or [] or {} or "OR"]
120 echo $[1 and 1.0 and true and [5] and {"d":1} and "AND"]
121
122 ## STDOUT:
123 s
124 None
125 x
126 y
127 y
128
129 42
130 0
131 42
132 0
133 0.5
134 0.0
135 ['a']
136 []
137 {'d': 1}
138 {}
139 OR
140 AND
141 ---
142 "s"
143 null
144 x
145 y
146 y
147
148 42
149 0
150 42
151 0
152 0.5
153 0.0
154 (List) ["a"]
155 (List) []
156 (Dict) {"d":1}
157 (Dict) {}
158 OR
159 AND
160 ## END
161
162 #### or BashArray, or BashAssoc
163 declare -a array=(1 2 3)
164 pp test_ (array or 'yy')
165
166 declare -A assoc=([k]=v)
167 pp test_ (assoc or 'zz')
168
169 ## STDOUT:
170 {"type":"BashArray","data":{"0":"1","1":"2","2":"3"}}
171 {"type":"BashAssoc","data":{"k":"v"}}
172 ## END
173
174 #### x if b else y
175 var b = true
176 var i = 42
177 var t = i+1 if b else i-1
178 echo $t
179 var f = i+1 if false else i-1
180 echo $f
181 ## STDOUT:
182 43
183 41
184 ## END
185