1 ## our_shell: ysh
2
3 #### single quoted -- implicit and explicit raw
4 var x = 'foo bar'
5 echo $x
6 setvar x = r'foo bar' # Same string
7 echo $x
8 setvar x = r'\t\n' # This is raw
9 echo $x
10 ## STDOUT:
11 foo bar
12 foo bar
13 \t\n
14 ## END
15
16 #### Implicit raw single quote with backslash is a syntax error
17 var x = '\t\n'
18 echo $x
19 ## status: 2
20 ## stdout-json: ""
21
22 #### single quoted C strings: $'foo\n'
23
24 # expression mode
25 var x = $'foo\nbar'
26 echo "$x"
27
28 # command mode
29 if test "$x" = $'foo\nbar'; then
30 echo equal
31 fi
32
33 ## STDOUT:
34 foo
35 bar
36 equal
37 ## END
38
39 #### Double Quoted
40 var name = 'World'
41 var g = "Hello $name"
42
43 echo "Hello $name"
44 echo $g
45 ## STDOUT:
46 Hello World
47 Hello World
48 ## END
49
50 #### Multiline strings with '' and ""
51
52 var single = '
53 single
54 '
55
56 var x = 42
57 var double = "
58 double $x
59 "
60
61 echo $single
62 echo $double
63
64 ## STDOUT:
65
66 single
67
68
69 double 42
70
71 ## END
72
73 #### C strings in %() array literals
74 shopt -s oil:upgrade
75
76 var lines=%($'aa\tbb' $'cc\tdd')
77 write @lines
78
79 ## STDOUT:
80 aa bb
81 cc dd
82 ## END
83
84 #### shopt parse_raw_string
85
86 # Ignored prefix
87 echo r'\'
88
89 # space
90 write r '' end
91
92 # These use shell rules!
93 echo ra'\'
94 echo raw'\'
95
96 echo r"\\"
97
98 # Now it's a regular r
99 shopt --unset parse_raw_string
100 write unset r'\'
101
102 ## STDOUT:
103 \
104 r
105
106 end
107 ra\
108 raw\
109 r\
110 unset
111 r\
112 ## END
113
114 #### Triple Double Quotes, Expression Mode
115
116 var line1 = """line1"""
117 echo line1=$line1
118 var line2 = """
119 line2"""
120 echo line2=$line2
121
122 var two = 2
123 var three = 3
124 var x = """
125 one "
126 two = $two ""
127 three = $three
128 """
129 echo "[$x]"
130
131 var x = """
132 good
133 bad
134 """
135 echo "[$x]"
136
137 ## STDOUT:
138 line1=line1
139 line2=line2
140 [one "
141 two = 2 ""
142 three = 3
143 ]
144 [good
145 bad
146 ]
147 ## END
148
149 #### Triple Single Quotes, Expression Mode
150
151 var two = 2
152 var three = 2
153
154 var x = '''
155 two = $two '
156 three = $three ''
157 \u{61}
158 '''
159 echo "[$x]"
160
161 var x = $'''
162 two = $two '
163 three = $three ''
164 \u{61}
165 '''
166 echo "[$x]"
167
168 ## STDOUT:
169 [two = $two '
170 three = $three ''
171 \u{61}
172 ]
173 [two = $two '
174 three = $three ''
175 a
176 ]
177 ## END
178
179
180 #### Triple Double Quotes, Command Mode
181
182 var two=2
183 var three=3
184
185 echo ""a # test lookahead
186
187 echo --
188 echo """
189 one "
190 two = $two ""
191 three = $three
192 """
193
194 echo --
195 tac <<< """
196 one "
197 two = $two ""
198 three = $three
199 """
200
201 shopt --unset parse_triple_quote
202
203 echo --
204 echo """
205 one
206 two = $two
207 three = $three
208 """
209
210
211 ## STDOUT:
212 a
213 --
214 one "
215 two = 2 ""
216 three = 3
217
218 --
219
220 three = 3
221 two = 2 ""
222 one "
223 --
224
225 one
226 two = 2
227 three = 3
228
229 ## END
230
231 #### raw strings and triple quotes
232
233 echo r'''a'''
234
235 shopt --unset parse_raw_string
236
237 echo r'''a'''
238
239 ## STDOUT:
240 a
241 ra
242 ## END
243
244
245 #### Triple Single Quotes, Command Mode
246
247 echo ''a # make sure lookahead doesn't mess up
248
249 echo --
250 echo '''
251 two = $two
252 '
253 '' '
254 \u{61}
255 '''
256 ## STDOUT:
257 a
258 --
259 two = $two
260 '
261 '' '
262 \u{61}
263
264 ## END
265
266 #### Triple Single Quotes, Here Doc
267
268 tac <<< '''
269 two = $two
270 '
271 '' '
272 \u{61}
273 '''
274
275 ## STDOUT:
276
277 \u{61}
278 '' '
279 '
280 two = $two
281 ## END
282
283 #### Triple Single Quotes, disabled
284
285 shopt --unset parse_triple_quote
286
287 echo '''
288 two = $two
289 \u{61}
290 '''
291
292 ## STDOUT:
293
294 two = $two
295 \u{61}
296
297 ## END
298
299
300 #### $''' in command mode
301
302 echo $'''
303 two = $two
304 '
305 '' '
306 \u{61}
307 '''
308
309 ## STDOUT:
310 two = $two
311 '
312 '' '
313 a
314
315 ## END
316
317 #### here doc with quotes
318
319 # This has 3 right double quotes
320
321 cat <<EOF
322 "hello"
323 ""
324 """
325 EOF
326
327
328 ## STDOUT:
329 "hello"
330 ""
331 """
332 ## END
333
334 #### triple quoted and implicit concatenation
335
336 # Should we allow this? Or I think it's possible to make it a syntax error
337
338 echo '''
339 single
340 '''zz
341
342 echo """
343 double
344 """zz
345 ## status: 2
346 ## stdout-json: ""