1 |
#!/bin/bash |
2 |
# |
3 |
# Tests for the args in: |
4 |
# |
5 |
# ${foo:-} |
6 |
# |
7 |
# I think the weird single quote behavior is a bug, but everyone agrees. It's |
8 |
# a consequence of quote removal. |
9 |
# |
10 |
# WEIRD: single quoted default, inside double quotes. Oh I guess this is |
11 |
# because double quotes don't treat single quotes as special? |
12 |
# |
13 |
# OK here is the issue. If we have ${} bare, then the default is parsed as |
14 |
# LexState.OUTER. If we have "${}", then it's parsed as LexState.DQ. That |
15 |
# makes sense I guess. Vim's syntax highlighting is throwing me off. |
16 |
|
17 |
### :- |
18 |
empty='' |
19 |
argv ${empty:-a} ${Unset:-b} |
20 |
# stdout: ['a', 'b'] |
21 |
|
22 |
### - |
23 |
empty='' |
24 |
argv ${empty-a} ${Unset-b} |
25 |
# empty one is still elided! |
26 |
# stdout: ['b'] |
27 |
|
28 |
### Inner single quotes |
29 |
argv ${Unset:-'b'} |
30 |
# stdout: ['b'] |
31 |
|
32 |
### Inner single quotes, outer double quotes |
33 |
# This is the WEIRD ONE. Single quotes appear outside. But all shells agree! |
34 |
argv "${Unset:-'b'}" |
35 |
# stdout: ["'b'"] |
36 |
|
37 |
### Inner double quotes |
38 |
argv ${Unset:-"b"} |
39 |
# stdout: ['b'] |
40 |
|
41 |
### Inner double quotes, outer double quotes |
42 |
argv "${Unset-"b"}" |
43 |
# stdout: ['b'] |
44 |
|
45 |
### Multiple words: no quotes |
46 |
argv ${Unset:-a b c} |
47 |
# stdout: ['a', 'b', 'c'] |
48 |
|
49 |
### Multiple words: no outer quotes, inner single quotes |
50 |
argv ${Unset:-'a b c'} |
51 |
# stdout: ['a b c'] |
52 |
|
53 |
### Multiple words: no outer quotes, inner double quotes |
54 |
argv ${Unset:-"a b c"} |
55 |
# stdout: ['a b c'] |
56 |
|
57 |
### Multiple words: outer double quotes, no inner quotes |
58 |
argv "${Unset:-a b c}" |
59 |
# stdout: ['a b c'] |
60 |
|
61 |
### Multiple words: outer double quotes, inner double quotes |
62 |
argv "${Unset:-"a b c"}" |
63 |
# stdout: ['a b c'] |
64 |
|
65 |
### Multiple words: outer double quotes, inner single quotes |
66 |
argv "${Unset:-'a b c'}" |
67 |
# WEIRD ONE. |
68 |
# stdout: ["'a b c'"] |
69 |
|
70 |
|
71 |
### Var with multiple words: no quotes |
72 |
var='a b c' |
73 |
argv ${Unset:-$var} |
74 |
# stdout: ['a', 'b', 'c'] |
75 |
|
76 |
### Multiple words: no outer quotes, inner single quotes |
77 |
var='a b c' |
78 |
argv ${Unset:-'$var'} |
79 |
# stdout: ['$var'] |
80 |
|
81 |
### Multiple words: no outer quotes, inner double quotes |
82 |
var='a b c' |
83 |
argv ${Unset:-"$var"} |
84 |
# stdout: ['a b c'] |
85 |
|
86 |
### Multiple words: outer double quotes, no inner quotes |
87 |
var='a b c' |
88 |
argv "${Unset:-$var}" |
89 |
# stdout: ['a b c'] |
90 |
|
91 |
### Multiple words: outer double quotes, inner double quotes |
92 |
var='a b c' |
93 |
argv "${Unset:-"$var"}" |
94 |
# stdout: ['a b c'] |
95 |
|
96 |
### Multiple words: outer double quotes, inner single quotes |
97 |
# WEIRD ONE. |
98 |
# |
99 |
# I think I should just disallow any word with single quotes inside double |
100 |
# quotes. |
101 |
var='a b c' |
102 |
argv "${Unset:-'$var'}" |
103 |
# stdout: ["'a b c'"] |
104 |
|
105 |
|
106 |
|
107 |
### No outer quotes, Multiple internal quotes |
108 |
# It's like a single command word. Parts are joined directly. |
109 |
var='a b c' |
110 |
argv ${Unset:-A$var " $var"D E F} |
111 |
# stdout: ['Aa', 'b', 'c', ' a b cD', 'E', 'F'] |
112 |
|
113 |
|
114 |
|
115 |
### Strip a string with single quotes, unquoted |
116 |
foo="'a b c d'" |
117 |
argv ${foo%d\'} |
118 |
# stdout: ["'a", 'b', 'c'] |
119 |
|
120 |
### Strip a string with single quotes, double quoted |
121 |
foo="'a b c d'" |
122 |
argv "${foo%d\'}" |
123 |
# stdout: ["'a b c "] |
124 |
|
125 |
### Strip a string with single quotes, double quoted, with unescaped ' |
126 |
# We're in a double quoted context, so we should be able to use a regular |
127 |
# single quote. This is very much the case with :-. |
128 |
foo="'a b c d'" |
129 |
argv "${foo%d'}" |
130 |
# stdout: ["'a b c "] |
131 |
# BUG bash/mksh stdout-json: "" |
132 |
|
133 |
### The string to strip is space sensitive |
134 |
foo='a b c d' |
135 |
argv "${foo%c d}" "${foo%c d}" |
136 |
# stdout: ['a b ', 'a b c d'] |
137 |
|
138 |
### The string to strip can be single quoted, outer is double quoted |
139 |
foo='a b c d' |
140 |
argv "${foo%'c d'}" "${foo%'c d'}" |
141 |
# stdout: ['a b ', 'a b c d'] |
142 |
# BUG dash stdout: ['a b c d', 'a b c d'] |
143 |
|
144 |
### The string to strip can be single quoted, outer is unquoted |
145 |
foo='a b c d' |
146 |
argv ${foo%'c d'} ${foo%'c d'} |
147 |
# stdout: ['a', 'b', 'a', 'b', 'c', 'd'] |