1 #!/bin/bash
2
3 ### no expansion
4 echo {foo}
5 # stdout: {foo}
6
7 ### expansion
8 echo {foo,bar}
9 # stdout: foo bar
10
11 ### double expansion
12 echo {a,b}_{c,d}
13 # stdout: a_c a_d b_c b_d
14
15 ### { in expansion
16 # bash and mksh treat this differently. bash treats the
17 # first { is a prefix. I think it's harder to read, and \{{a,b} should be
18 # required.
19 echo {{a,b}
20 # stdout: {{a,b}
21 # BUG bash stdout: {a {b
22
23 ### quoted { in expansion
24 echo \{{a,b}
25 # stdout: {a {b
26
27 ### } in expansion
28 # hm they treat this the SAME. Leftmost { is matched by first }, and then
29 # there is another } as the postfix.
30 echo {a,b}}
31 # stdout: a} b}
32
33 ### Empty expansion
34 echo a{X,,Y}b
35 # stdout: aXb ab aYb
36
37 ### nested brace expansion
38 echo X{A,x{a,b}y,B}Y
39 # stdout: XAY XxayY XxbyY XBY
40
41 ### expansion on RHS of assignment
42 # I think bash's behavior is more consistent. No splitting either.
43 v={X,Y}
44 echo $v
45 # stdout: {X,Y}
46 # BUG mksh stdout: X Y
47
48 ### no expansion with RHS assignment
49 {v,x}=X
50 # status: 127
51
52 ### Tilde expansion
53 HOME=/home/foo
54 echo ~
55 HOME=/home/bar
56 echo ~
57 # stdout-json: "/home/foo\n/home/bar\n"
58
59 ### Tilde expansion with brace expansion
60 # The brace expansion happens FIRST. After that, the second token has tilde
61 # FIRST, so it gets expanded. The first token has an unexpanded tilde, because
62 # it's not in the leading position.
63 # NOTE: mksh gives different behavior! So it probably doesn't matter that
64 # much...
65 HOME=/home/bob
66 echo {foo~,~}/bar
67 # stdout: foo~/bar /home/bob/bar
68 # OK mksh stdout: foo~/bar ~/bar
69
70 ### Two kinds of tilde expansion
71 # ~/foo and ~bar
72 HOME=/home/bob
73 echo ~{/src,root}
74 # stdout: /home/bob/src /root
75 # OK mksh stdout: ~/src ~root
76
77 ### Tilde expansion come before var expansion
78 HOME=/home/bob
79 foo=~
80 echo $foo
81 foo='~'
82 echo $foo
83 # In the second instance, we expand into a literal ~, and since var expansion
84 # comes after tilde expansion, it is NOT tried again.
85 # stdout-json: "/home/bob\n~\n"