blob: 87381e12eaa177612212b2d277cc19a14014f687 [file] [log] [blame]
Bram Moolenaar79186be2023-06-24 01:35:51 +01001#!/bin/dash -x
Bram Moolenaar1aa5f1c2023-06-22 21:57:51 +01002# sh5
3# Note that this is special for sh. ksh will be an extra file later.
4# Note too, that sh and ksh allow ${var:-sub} as well as ${var-sub}!
5# The ':' is optional!
6
7# This all should be OK
8# Case 0a
9[ -t 0 ] && date
10Variable1=value1
11Variable2='value2'
12Variable3="value3"
13echo "$Variable1" "$Variable2" "$Variable3"
14
15# Case 0b
16[ -t 0 ] && echo "\ndate"
17Variable1=$HOME
18Variable2='$HOME'
19Variable3="$HOME"
20echo "$Variable1" "$Variable2" "$Variable3"
21
22# Case 0c
23[ -t 0 ] && echo "\ndate"
24Variable1=$HOME$SHELL
25Variable2=$HOME.$SHELL
26Variable3=$HOME.$SHELL+$HOME-$SHELL/$HOME
27echo "$Variable1" "$Variable2" "$Variable3"
28
29# Case 0d
30[ -t 0 ] && echo "\ndate"
31Variable1=`date`
32Variable2=`id -ng`
33Variable3=`id -ng | wc -c`
34echo "$Variable1" "$Variable2" "$Variable3"
35
36################################################################################
37#
38# Case 1a with constants
39[ -t 0 ] && echo "\ndate"
40Variable1=${VariableA:=eng1}
41Variable2=${VariableA:-eng2}
42Variable3=${VariableA:?eng3}
43Variable3=${VariableA:+eng3}
44echo "$Variable1" "$Variable2" "$Variable3"
45
46# Case 1b with constants in single quotes
47[ -t 0 ] && echo "\ndate"
48Variable1=${VariableA:='eng1'}
49Variable2=${VariableA:-'eng2'}
50Variable3=${VariableA:?'eng3'}
51Variable3=${VariableA:+'eng3'}
52echo "$Variable1" "$Variable2" "$Variable3"
53
54# Case 1c with constants in double quotes
55[ -t 0 ] && echo "\ndate"
56Variable1=${VariableA:="eng1"}
57Variable2=${VariableA:-"eng2"}
58Variable3=${VariableA:?"eng3"}
59Variable3=${VariableA:+"eng3"}
60echo "$Variable1" "$Variable2" "$Variable3"
61
62# Case 1d: constants but missing colons
63Variable1=${VariableA=eng1}
64Variable2=${VariableA-eng2}
65Variable3=${VariableA?eng3}
66Variable3=${VariableA+eng3}
67Variable1=${VariableA='eng1'}
68Variable2=${VariableA-'eng2'}
69Variable3=${VariableA?'eng3'}
70Variable3=${VariableA+'eng3'}
71Variable1=${VariableA="eng1"}
72Variable2=${VariableA-"eng2"}
73Variable3=${VariableA?"eng3"}
74Variable3=${VariableA+"eng3"}
75
76# Case 2a with a variable
77[ -t 0 ] && echo "\ndate"
78Variable1=${VariableA:=$HOME}
79Variable2=${VariableA:-$HOME}
80Variable3=${VariableA:?$HOME}
81Variable3=${VariableA:+$HOME}
82echo "$Variable1" "$Variable2" "$Variable3"
83
84# Case 2b with a variable in single quotes
85[ -t 0 ] && echo "\ndate"
86Variable1=${VariableA:='$HOME'}
87Variable2=${VariableA:-'$HOME'}
88Variable3=${VariableA:?'$HOME'}
89Variable3=${VariableA:+'$HOME'}
90echo "$Variable1" "$Variable2" "$Variable3"
91
92# Case 2c with a variable in double quotes
93[ -t 0 ] && echo "\ndate"
94Variable1=${VariableA:="$HOME"}
95Variable2=${VariableA:-"$HOME"}
96Variable3=${VariableA:?"$HOME"}
97Variable3=${VariableA:+"$HOME"}
98echo "$Variable1" "$Variable2" "$Variable3"
99
100# Case 3a with a command substitution
101[ -t 0 ] && echo "\ndate"
102Variable1=${VariableA:=`date`}
103Variable2=${VariableA:-`date`}
104Variable3=${VariableA:?`date`}
105Variable3=${VariableA:+`date`}
106echo "$Variable1" "$Variable2" "$Variable3"
107
108# Case 3b with a command + option substitution
109[ -t 0 ] && echo "\ndate"
110Variable1=${VariableA:=`id -ng`}
111Variable2=${VariableA:-`id -ng`}
112Variable3=${VariableA:?`id -ng`}
113Variable3=${VariableA:+`id -ng`}
114echo "$Variable1" "$Variable2" "$Variable3"
115
116# Case 3c with a command + pipe substitution
117[ -t 0 ] && echo "\ndate"
118Variable1=${VariableA:=`id -ng | wc -c`}
119Variable2=${VariableA:-`id -ng | wc -c`}
120Variable3=${VariableA:?`id -ng | wc -c`}
121Variable3=${VariableA:+`id -ng | wc -c`}
122echo "$Variable1" "$Variable2" "$Variable3"
123
124################################################################################
125#
126# The same with one nestet ${} level
127# Case 1a with constants
128[ -t 0 ] && echo "\ndate"
129Variable1=${VariableA:-${VarB:=eng1}}
130Variable2=${VariableA:-${VarB:-eng2}}
131Variable3=${VariableA:-${VarB:?eng3}}
132Variable3=${VariableA:-${VarB:+eng3}}
133echo "$Variable1" "$Variable2" "$Variable3"
134
135# Case 1b with constants in single quotes
136[ -t 0 ] && echo "\ndate"
137Variable1=${VariableA:-${VarB:='eng1'}}
138Variable2=${VariableA:-${VarB:-'eng2'}}
139Variable3=${VariableA:-${VarB:?'eng3'}}
140Variable3=${VariableA:-${VarB:+'eng3'}}
141echo "$Variable1" "$Variable2" "$Variable3"
142
143# Case 1c with constants in double quotes
144[ -t 0 ] && echo "\ndate"
145Variable1=${VariableA:-${VarB:="eng1"}}
146Variable2=${VariableA:-${VarB:-"eng2"}}
147Variable3=${VariableA:-${VarB:?"eng3"}}
148Variable3=${VariableA:-${VarB:+"eng3"}}
149echo "$Variable1" "$Variable2" "$Variable3"
150
151# Case 2a with a variable
152[ -t 0 ] && echo "\ndate"
153Variable1=${VariableA:-${VarB:=$HOME}}
154Variable2=${VariableA:-${VarB:-$HOME}}
155Variable3=${VariableA:-${VarB:?$HOME}}
156Variable3=${VariableA:-${VarB:+$HOME}}
157echo "$Variable1" "$Variable2" "$Variable3"
158
159# Case 2b with a variable in single quotes
160[ -t 0 ] && echo "\ndate"
161Variable1=${VariableA:-${VarB:='$HOME'}}
162Variable2=${VariableA:-${VarB:-'$HOME'}}
163Variable3=${VariableA:-${VarB:?'$HOME'}}
164Variable3=${VariableA:-${VarB:+'$HOME'}}
165echo "$Variable1" "$Variable2" "$Variable3"
166
167# Case 2c with a variable in double quotes
168[ -t 0 ] && echo "\ndate"
169Variable1=${VariableA:-${VarB:="$HOME"}}
170Variable2=${VariableA:-${VarB:-"$HOME"}}
171Variable3=${VariableA:-${VarB:?"$HOME"}}
172Variable3=${VariableA:-${VarB:+"$HOME"}}
173echo "$Variable1" "$Variable2" "$Variable3"
174
175# Case 3a with a command substitution
176[ -t 0 ] && echo "\ndate"
177Variable1=${VariableA:-${VarB:=`date`}}
178Variable2=${VariableA:-${VarB:-`date`}}
179Variable3=${VariableA:-${VarB:?`date`}}
180Variable3=${VariableA:-${VarB:+`date`}}
181echo "$Variable1" "$Variable2" "$Variable3"
182
183# Case 3b with a command + option substitution
184[ -t 0 ] && echo "\ndate"
185Variable1=${VariableA:-${VarB:=`id -ng`}}
186Variable2=${VariableA:-${VarB:-`id -ng`}}
187Variable3=${VariableA:-${VarB:?`id -ng`}}
188Variable3=${VariableA:-${VarB:+`id -ng`}}
189echo "$Variable1" "$Variable2" "$Variable3"
190
191# Case 3c with a command + pipe substitution
192[ -t 0 ] && echo "\ndate"
193Variable1=${VariableA:-${VarB:=`id -ng | wc -c`}}
194Variable2=${VariableA:-${VarB:-`id -ng | wc -c`}}
195Variable3=${VariableA:-${VarB:?`id -ng | wc -c`}}
196Variable3=${VariableA:-${VarB:+`id -ng | wc -c`}}
197echo "$Variable1" "$Variable2" "$Variable3"
198
199################################################################################
200#
201# The same with two nestet ${} level
202# Case 1a with constants
203[ -t 0 ] && echo "\ndate"
204Variable1=${VariableA:-${VarB:-${VarC:=eng1}}}
205Variable2=${VariableA:-${VarB:-${VarC:-eng2}}}
206Variable3=${VariableA:-${VarB:-${VarC:?eng3}}}
207Variable3=${VariableA:-${VarB:-${VarC:+eng3}}}
208echo "$Variable1" "$Variable2" "$Variable3"
209
210# Case 1b with constants in single quotes
211[ -t 0 ] && echo "\ndate"
212Variable1=${VariableA:-${VarB:-${VarC:='eng1'}}}
213Variable2=${VariableA:-${VarB:-${VarC:-'eng2'}}}
214Variable3=${VariableA:-${VarB:-${VarC:?'eng3'}}}
215Variable3=${VariableA:-${VarB:-${VarC:+'eng3'}}}
216echo "$Variable1" "$Variable2" "$Variable3"
217
218# Case 1c with constants in double quotes
219[ -t 0 ] && echo "\ndate"
220Variable1=${VariableA:-${VarB:-${VarC:="eng1"}}}
221Variable2=${VariableA:-${VarB:-${VarC:-"eng2"}}}
222Variable3=${VariableA:-${VarB:-${VarC:?"eng3"}}}
223Variable3=${VariableA:-${VarB:-${VarC:+"eng3"}}}
224echo "$Variable1" "$Variable2" "$Variable3"
225
226# Case 2a with a variable
227[ -t 0 ] && echo "\ndate"
228Variable1=${VariableA:-${VarB:-${VarC:=$HOME}}}
229Variable2=${VariableA:-${VarB:-${VarC:-$HOME}}}
230Variable3=${VariableA:-${VarB:-${VarC:?$HOME}}}
231Variable3=${VariableA:-${VarB:-${VarC:+$HOME}}}
232echo "$Variable1" "$Variable2" "$Variable3"
233
234# Case 2b with a variable in single quotes
235[ -t 0 ] && echo "\ndate"
236Variable1=${VariableA:-${VarB:-${VarC:='$HOME'}}}
237Variable2=${VariableA:-${VarB:-${VarC:-'$HOME'}}}
238Variable3=${VariableA:-${VarB:-${VarC:?'$HOME'}}}
239Variable3=${VariableA:-${VarB:-${VarC:+'$HOME'}}}
240echo "$Variable1" "$Variable2" "$Variable3"
241
242# Case 2c with a variable in double quotes
243[ -t 0 ] && echo "\ndate"
244Variable1=${VariableA:-${VarB:-${VarC:="$HOME"}}}
245Variable2=${VariableA:-${VarB:-${VarC:-"$HOME"}}}
246Variable3=${VariableA:-${VarB:-${VarC:?"$HOME"}}}
247Variable3=${VariableA:-${VarB:-${VarC:?"$HOME"}}}
248Variable3=${VariableA:-${VarB:-${VarC:+"$HOME"}}}
249echo "$Variable1" "$Variable2" "$Variable3"
250
251# Case 3a with a command substitution
252[ -t 0 ] && echo "\ndate"
253Variable1=${VariableA:-${VarB:-${VarC:=`date`}}}
254Variable2=${VariableA:-${VarB:-${VarC:-`date`}}}
255Variable3=${VariableA:-${VarB:-${VarC:?`date`}}}
256Variable3=${VariableA:-${VarB:-${VarC:+`date`}}}
257echo "$Variable1" "$Variable2" "$Variable3"
258
259# Case 3b with a command + option substitution
260[ -t 0 ] && echo "\ndate"
261Variable1=${VariableA:-${VarB:-${VarC:=`id -ng`}}}
262Variable2=${VariableA:-${VarB:-${VarC:-`id -ng`}}}
263Variable3=${VariableA:-${VarB:-${VarC:?`id -ng`}}}
264Variable3=${VariableA:-${VarB:-${VarC:+`id -ng`}}}
265echo "$Variable1" "$Variable2" "$Variable3"
266
267# Case 3c with a command + pipe substitution
268[ -t 0 ] && echo "\ndate"
269Variable1=${VariableA:-${VarB:-${VarC:=`id -ng | wc -c`}}}
270Variable2=${VariableA:-${VarB:-${VarC:-`id -ng | wc -c`}}}
271Variable3=${VariableA:-${VarB:-${VarC:?`id -ng | wc -c`}}}
272Variable3=${VariableA:-${VarB:-${VarC:+`id -ng | wc -c`}}}
273echo "$Variable1" "$Variable2" "$Variable3"
274
275
276################################################################################
277#
278# The same with three nestet ${} level
279# Case 1a with constants
280[ -t 0 ] && echo "\ndate"
281Variable1=${VariableA:-${VarB:-${VarC:-${VarD:=eng1}}}}
282Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-eng2}}}}
283Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?eng3}}}}
284Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+eng3}}}}
285echo "$Variable1" "$Variable2" "$Variable3"
286
287# Case 1b with constants in single quotes
288[ -t 0 ] && echo "\ndate"
289Variable1=${VariableA:-${VarB:-${VarC:-${VarD:='eng1'}}}}
290Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-'eng2'}}}}
291Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?'eng3'}}}}
292Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+'eng3'}}}}
293echo "$Variable1" "$Variable2" "$Variable3"
294
295# Case 1c with constants in double quotes
296[ -t 0 ] && echo "\ndate"
297Variable1=${VariableA:-${VarB:-${VarC:-${VarD:="eng1"}}}}
298Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-"eng2"}}}}
299Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?"eng3"}}}}
300Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+"eng3"}}}}
301echo "$Variable1" "$Variable2" "$Variable3"
302
303# Case 2a with a variable
304[ -t 0 ] && echo "\ndate"
305Variable1=${VariableA:-${VarB:-${VarC:-${VarD:=$HOME}}}}
306Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-$HOME}}}}
307Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?$HOME}}}}
308Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+$HOME}}}}
309echo "$Variable1" "$Variable2" "$Variable3"
310
311# Case 2b with a variable in single quotes
312[ -t 0 ] && echo "\ndate"
313Variable1=${VariableA:-${VarB:-${VarC:-${VarD:='$HOME'}}}}
314Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-'$HOME'}}}}
315Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?'$HOME'}}}}
316Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+'$HOME'}}}}
317echo "$Variable1" "$Variable2" "$Variable3"
318
319# Case 2c with a variable in double quotes
320[ -t 0 ] && echo "\ndate"
321Variable1=${VariableA:-${VarB:-${VarC:-${VarD:="$HOME"}}}}
322Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-"$HOME"}}}}
323Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?"$HOME"}}}}
324Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+"$HOME"}}}}
325echo "$Variable1" "$Variable2" "$Variable3"
326
327# Case 3a with a command substitution
328[ -t 0 ] && echo "\ndate"
329Variable1=${VariableA:-${VarB:-${VarC:-${VarD:=`date`}}}}
330Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-`date`}}}}
331Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?`date`}}}}
332Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+`date`}}}}
333echo "$Variable1" "$Variable2" "$Variable3"
334
335# Case 3b with a command + option substitution
336[ -t 0 ] && echo "\ndate"
337Variable1=${VariableA:-${VarB:-${VarC:-${VarD:=`id -ng`}}}}
338Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-`id -ng`}}}}
339Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?`id -ng`}}}}
340Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+`id -ng`}}}}
341echo "$Variable1" "$Variable2" "$Variable3"
342
343# Case 3c with a command + pipe substitution
344[ -t 0 ] && echo "\ndate"
345Variable1=${VariableA:-${VarB:-${VarC:-${VarD:=`id -ng | wc -c`}}}}
346Variable2=${VariableA:-${VarB:-${VarC:-${VarD:-`id -ng | wc -c`}}}}
347Variable3=${VariableA:-${VarB:-${VarC:-${VarD:?`id -ng | wc -c`}}}}
348Variable3=${VariableA:-${VarB:-${VarC:-${VarD:+`id -ng | wc -c`}}}}
349echo "$Variable1" "$Variable2" "$Variable3"
350
351
352################################################################################
353#
354# This is also allowed:
355Variable1=${VariableA-${VarB-${VarC-${VarD=`id -ng | wc -c`}}}}
356
357################################################################################
358#
359# All cases with ${Var:?} which works for the sh:
360Variable4=${Variable4:?}
361Variable4=${Variable4:?OK}
362Variable4=${Variable4:?`date`}
363Variable4=${Variable4:?'an OK string'}
364Variable4=${Variable4:?"an OK string"}
365Variable4=${Variable4:?$HOME$SHELL}
366Variable4=${Variable4:?$HOME:$SHELL}
367
368# All cases with ${Var:?} which works also for ksh:
369Variable4=${Variable4:?This is OK}
370Variable4=${Variable4:?This is OK, too: `date`}
371
372# What happens with ${#identifier[*]}:
373Variable5=${#identifier[*]}