1 ## our_shell: ysh
2
3 #### Unquoted backslash escapes, as in J8 strings
4
5 # everything except \b \f \n
6
7 var nl = \n
8 pp line (nl)
9
10 var tab = \t
11 pp line (tab)
12
13 pp line (\r)
14
15 pp line (\" ++ \' ++ \\)
16
17 echo backslash $[\\]
18 echo "backslash $[\\]"
19
20 ## STDOUT:
21 (Str) "\n"
22 (Str) "\t"
23 (Str) "\r"
24 (Str) "\"'\\"
25 backslash \
26 backslash \
27 ## END
28
29 #### Unquoted \u{3bc} escape
30
31 var x = 'mu ' ++ \u{3bc}
32 echo $x
33
34 echo mu $[\u{3bc}]
35 echo "mu $[\u{3bc}]"
36
37 ## STDOUT:
38 mu μ
39 mu μ
40 mu μ
41 ## END
42
43 #### Unquoted \y24 escape
44
45 var x = 'foo ' ++ \y24
46 echo $x
47
48 var y = 0x24
49 echo $y
50
51 echo foo $[\y40]
52 echo "foo $[\y41]"
53
54 ## STDOUT:
55 foo $
56 36
57 foo @
58 foo A
59 ## END
60
61 #### single quoted -- implicit and explicit raw
62 var x = 'foo bar'
63 echo $x
64 setvar x = r'foo bar' # Same string
65 echo $x
66 setvar x = r'\t\n' # This is raw
67 echo $x
68 ## STDOUT:
69 foo bar
70 foo bar
71 \t\n
72 ## END
73
74 #### Implicit raw single quote with backslash is a syntax error
75 var x = '\t\n'
76 echo $x
77 ## status: 2
78 ## stdout-json: ""
79
80 #### $"foo $x" to make "foo $x" explicit
81
82 var x = $"bar"
83
84 # expression mode
85 var y = $"foo $x"
86 echo "$y"
87
88 # command mode
89 if test "$y" = $"foo $x"; then
90 echo equal
91 fi
92
93 ## STDOUT:
94 foo bar
95 equal
96 ## END
97
98 #### single quoted C strings: $'foo\n'
99
100 # expression mode
101 var x = $'foo\nbar'
102 echo "$x"
103
104 # command mode
105 if test "$x" = $'foo\nbar'; then
106 echo equal
107 fi
108
109 ## STDOUT:
110 foo
111 bar
112 equal
113 ## END
114
115 #### raw strings and J8 strings don't work in OSH
116 shopt --unset ysh:all
117
118 echo r'hello \'
119 echo u'mu \u{3bc}'
120 echo b'byte \yff'
121
122 echo --
123
124 echo r'''
125 raw multi
126 '''
127
128 echo u'''
129 u multi
130 '''
131
132 echo b'''
133 b multi
134 '''
135
136 ## STDOUT:
137 rhello \
138 umu \u{3bc}
139 bbyte \yff
140 --
141 r
142 raw multi
143
144 u
145 u multi
146
147 b
148 b multi
149
150 ## END
151
152 #### J8-style u'' and b'' strings in expression mode
153
154 var x = u'\u{3bc}'
155 var y = b'\yff'
156
157
158 write --end '' -- $x | od -A n -t x1
159 write --end '' -- $y | od -A n -t x1
160
161 ## STDOUT:
162 ce bc
163 ff
164 ## END
165
166 #### J8-style u'' and b'' strings in command mode
167
168 write --end '' -- u'\u{3bc}' | od -A n -t x1
169 write --end '' -- b'\yff' | od -A n -t x1
170
171 # TODO: make this be illegal
172 # echo u'hello \u03bc'
173
174 ## STDOUT:
175 ce bc
176 ff
177 ## END
178
179 #### J8-style multi-line strings u''' b''' in command mode
180
181 write --end '' -- u'''
182 --
183 \u{61}
184 --
185 '''
186 write --end '' -- b'''
187 --
188 \y62
189 --
190 '''
191
192 # Should be illegal?
193 #echo u'hello \u03bc'
194
195 ## STDOUT:
196 --
197 a
198 --
199 --
200 b
201 --
202 ## END
203
204 #### Double Quoted
205 var name = 'World'
206 var g = "Hello $name"
207
208 echo "Hello $name"
209 echo $g
210 ## STDOUT:
211 Hello World
212 Hello World
213 ## END
214
215 #### Multiline strings with '' and ""
216
217 var single = '
218 single
219 '
220
221 var x = 42
222 var double = "
223 double $x
224 "
225
226 echo $single
227 echo $double
228
229 ## STDOUT:
230
231 single
232
233
234 double 42
235
236 ## END
237
238 #### C strings in %() array literals
239 shopt -s oil:upgrade
240
241 var lines=%($'aa\tbb' $'cc\tdd')
242 write @lines
243
244 ## STDOUT:
245 aa bb
246 cc dd
247 ## END
248
249 #### shopt parse_ysh_string
250
251 # Ignored prefix
252 echo r'\'
253
254 # space
255 write r '' end
256
257 # These use shell rules!
258 echo ra'\'
259 echo raw'\'
260
261 echo r"\\"
262
263 # Now it's a regular r
264 shopt --unset parse_ysh_string
265 write unset r'\'
266
267 ## STDOUT:
268 \
269 r
270
271 end
272 ra\
273 raw\
274 r\
275 unset
276 r\
277 ## END
278
279 #### $''' isn't a a multiline string (removed)
280
281 shopt -s ysh:upgrade
282
283 echo $'''
284 foo
285 '''
286
287 ## STDOUT:
288
289 foo
290
291 ## END
292
293
294 #### """ and $""" in Expression Mode
295
296 var line1 = """line1"""
297 echo line1=$line1
298 var line2 = """
299 line2"""
300 echo line2=$line2
301
302 var two = 2
303 var three = 3
304 var x = """
305 one "
306 two = $two ""
307 three = $three
308 """
309 echo "[$x]"
310
311 var i = 42
312 var x = """
313 good
314 bad $i
315 """
316 echo "[$x]"
317
318 # alias
319 var x = $"""
320 good
321 bad $i
322 """
323 echo "[$x]"
324
325 ## STDOUT:
326 line1=line1
327 line2=line2
328 [one "
329 two = 2 ""
330 three = 3
331 ]
332 [good
333 bad 42
334 ]
335 [good
336 bad 42
337 ]
338 ## END
339
340 #### ''' in Expression Mode
341
342 var two = 2
343 var three = 2
344
345 var x = '''
346 two = $two '
347 three = $three ''
348 \u{61}
349 '''
350 echo "[$x]"
351
352 var x = u'''
353 two = $two '
354 three = $three ''
355 \u{61}
356 '''
357 echo "[$x]"
358
359 var x = b'''
360 two = $two '
361 three = $three ''
362 \u{61} \y61
363 '''
364 echo "[$x]"
365
366 ## STDOUT:
367 [two = $two '
368 three = $three ''
369 \u{61}
370 ]
371 [two = $two '
372 three = $three ''
373 a
374 ]
375 [two = $two '
376 three = $three ''
377 a a
378 ]
379 ## END
380
381
382 #### """ and $""" in Command Mode
383
384 var two=2
385 var three=3
386
387 echo ""a # test lookahead
388
389 echo --
390 echo """
391 one "
392 two = $two ""
393 three = $three
394 """
395
396 # optional $ prefix
397 echo --
398 echo $"""
399 one "
400 two = $two ""
401 three = $three
402 """
403
404 echo --
405 tac <<< """
406 one "
407 two = $two ""
408 three = $three
409 """
410
411 shopt --unset parse_triple_quote
412
413 echo --
414 echo """
415 one
416 two = $two
417 three = $three
418 """
419
420
421 ## STDOUT:
422 a
423 --
424 one "
425 two = 2 ""
426 three = 3
427
428 --
429 one "
430 two = 2 ""
431 three = 3
432
433 --
434
435 three = 3
436 two = 2 ""
437 one "
438 --
439
440 one
441 two = 2
442 three = 3
443
444 ## END
445
446
447 #### ''' in Command Mode
448
449 echo ''a # make sure lookahead doesn't mess up
450
451 echo --
452 echo '''
453 two = $two
454 '
455 '' '
456 \u{61}
457 '''
458 ## STDOUT:
459 a
460 --
461 two = $two
462 '
463 '' '
464 \u{61}
465
466 ## END
467
468 #### r''' in Command Mode, Expression mode
469
470 echo r'''\'''
471
472 var x = r'''\'''
473 echo $x
474
475 shopt --unset parse_ysh_string
476
477 echo r'''\'''
478
479 ## STDOUT:
480 \
481 \
482 r\
483 ## END
484
485
486 #### ''' in Here Doc
487
488 tac <<< '''
489 two = $two
490 '
491 '' '
492 \u{61}
493 '''
494
495 ## STDOUT:
496
497 \u{61}
498 '' '
499 '
500 two = $two
501 ## END
502
503 #### ''' without parse_triple_quote
504
505 shopt --unset parse_triple_quote
506
507 echo '''
508 two = $two
509 \u{61}
510 '''
511
512 ## STDOUT:
513
514 two = $two
515 \u{61}
516
517 ## END
518
519 #### here doc with quotes
520
521 # This has 3 right double quotes
522
523 cat <<EOF
524 "hello"
525 ""
526 """
527 EOF
528
529
530 ## STDOUT:
531 "hello"
532 ""
533 """
534 ## END
535
536 #### triple quoted and implicit concatenation
537
538 # Should we allow this? Or I think it's possible to make it a syntax error
539
540 echo '''
541 single
542 '''zz
543
544 echo """
545 double
546 """zz
547 ## status: 2
548 ## stdout-json: ""