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