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 test_ (nl)
9
10 var tab = \t
11 pp test_ (tab)
12
13 pp test_ (\r)
14
15 pp test_ (\" ++ \' ++ \\)
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 ysh: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 echo r"\\"
258
259 # Now it's a regular r
260 shopt --unset parse_ysh_string
261 write unset r'\'
262
263 ## STDOUT:
264 \
265 r
266
267 end
268 r\
269 unset
270 r\
271 ## END
272
273 #### Special rule for <<< ''' and <<< """ - no extra newline
274
275 read --all <<< unquoted
276 pp test_ (_reply)
277
278 read --all <<< 'single with newline'
279 pp test_ (_reply)
280
281 read --all <<< "double with newline"
282 pp test_ (_reply)
283
284 read --all <<< u'j8 with newline'
285 pp test_ (_reply)
286
287 echo
288
289 read --all <<< '''
290 multi
291 single
292 '''
293 pp test_ (_reply)
294
295 read --all <<< """
296 multi
297 double
298 """
299 pp test_ (_reply)
300
301 read --all <<< u'''
302 multi
303 j8
304 '''
305 pp test_ (_reply)
306
307
308 ## STDOUT:
309 (Str) "unquoted\n"
310 (Str) "single with newline\n"
311 (Str) "double with newline\n"
312 (Str) "j8 with newline\n"
313
314 (Str) "multi\nsingle\n"
315 (Str) "multi\ndouble\n"
316 (Str) "multi\nj8\n"
317 ## END
318
319 #### $''' isn't a a multiline string (removed)
320
321 shopt -s ysh:upgrade
322
323 echo $'''
324 foo
325 '''
326
327 ## status: 2
328 ## STDOUT:
329 ## END
330
331
332 #### """ and $""" in Expression Mode
333
334 var line1 = """line1"""
335 echo line1=$line1
336 var line2 = """
337 line2"""
338 echo line2=$line2
339
340 var two = 2
341 var three = 3
342 var x = """
343 one "
344 two = $two ""
345 three = $three
346 """
347 echo "[$x]"
348
349 var i = 42
350 var x = """
351 good
352 bad $i
353 """
354 echo "[$x]"
355
356 # alias
357 var x = $"""
358 good
359 bad $i
360 """
361 echo "[$x]"
362
363 ## STDOUT:
364 line1=line1
365 line2=line2
366 [one "
367 two = 2 ""
368 three = 3
369 ]
370 [good
371 bad 42
372 ]
373 [good
374 bad 42
375 ]
376 ## END
377
378 #### ''' in Expression Mode
379
380 var two = 2
381 var three = 2
382
383 var x = '''
384 two = $two '
385 three = $three ''
386 \u{61}
387 '''
388 echo "[$x]"
389
390 var x = u'''
391 two = $two '
392 three = $three ''
393 \u{61}
394 '''
395 echo "[$x]"
396
397 var x = b'''
398 two = $two '
399 three = $three ''
400 \u{61} \y61
401 '''
402 echo "[$x]"
403
404 ## STDOUT:
405 [two = $two '
406 three = $three ''
407 \u{61}
408 ]
409 [two = $two '
410 three = $three ''
411 a
412 ]
413 [two = $two '
414 three = $three ''
415 a a
416 ]
417 ## END
418
419
420 #### """ and $""" in Command Mode
421
422 var two=2
423 var three=3
424
425 echo ""a # test lookahead
426
427 echo --
428 echo """
429 one "
430 two = $two ""
431 three = $three
432 """
433
434 # optional $ prefix
435 echo --
436 echo $"""
437 one "
438 two = $two ""
439 three = $three
440 """
441
442 echo --
443 tac <<< """
444 one "
445 two = $two ""
446 three = $three
447 """
448
449 shopt --unset parse_triple_quote
450
451 echo --
452 echo """
453 one
454 two = $two
455 three = $three
456 """
457
458
459 ## STDOUT:
460 a
461 --
462 one "
463 two = 2 ""
464 three = 3
465
466 --
467 one "
468 two = 2 ""
469 three = 3
470
471 --
472 three = 3
473 two = 2 ""
474 one "
475 --
476
477 one
478 two = 2
479 three = 3
480
481 ## END
482
483
484 #### ''' in Command Mode
485
486 echo --
487 echo '''
488 two = $two
489 '
490 '' '
491 \u{61}
492 '''
493 ## STDOUT:
494 --
495 two = $two
496 '
497 '' '
498 \u{61}
499
500 ## END
501
502 #### r''' in Command Mode, Expression mode
503
504 echo r'''\'''
505
506 var x = r'''\'''
507 echo $x
508
509 shopt --unset parse_ysh_string
510
511 echo r'''\'''
512
513 ## STDOUT:
514 \
515 \
516 r\
517 ## END
518
519
520 #### ''' in Here Doc
521
522 tac <<< '''
523 two = $two
524 '
525 '' '
526 \u{61}
527 '''
528
529 ## STDOUT:
530 \u{61}
531 '' '
532 '
533 two = $two
534 ## END
535
536 #### ''' without parse_triple_quote
537
538 shopt --unset parse_triple_quote
539
540 echo '''
541 two = $two
542 \u{61}
543 '''
544
545 ## status: 2
546 ## STDOUT:
547 ## END
548
549 #### here doc with quotes
550
551 # This has 3 right double quotes
552
553 cat <<EOF
554 "hello"
555 ""
556 """
557 EOF
558
559
560 ## STDOUT:
561 "hello"
562 ""
563 """
564 ## END
565
566 #### triple quoted and implicit concatenation
567
568 # Should we allow this? Or I think it's possible to make it a syntax error
569
570 echo '''
571 single
572 '''zz
573
574 echo """
575 double
576 """zz
577 ## status: 2
578 ## stdout-json: ""
579