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