1 #!/usr/bin/env bash
2 #
3 # Tests for quotes.
4
5 ### Unquoted words
6 echo unquoted words
7 # stdout: unquoted words
8
9 ### Single-quoted
10 echo 'single quoted'
11 # stdout: single quoted
12
13 ### Two single-quoted parts
14 echo 'two single-quoted pa''rts in one token'
15 # stdout: two single-quoted parts in one token
16
17 ### Unquoted and single quoted
18 echo unquoted' and single-quoted'
19 # stdout: unquoted and single-quoted
20
21 ### newline inside single-quoted string
22 echo 'newline
23 inside single-quoted string'
24 # stdout-json: "newline\ninside single-quoted string\n"
25
26 ### Double-quoted
27 echo "double quoted"
28 # stdout: double quoted
29
30 ### Mix of quotes in one word
31 echo unquoted' single-quoted'" double-quoted "unquoted
32 # stdout: unquoted single-quoted double-quoted unquoted
33
34 ### Var substitution
35 FOO=bar
36 echo "==$FOO=="
37 # stdout: ==bar==
38
39 ### Var substitution with braces
40 FOO=bar
41 echo foo${FOO}
42 # stdout: foobar
43
44 ### Var substitution with braces, quoted
45 FOO=bar
46 echo "foo${FOO}"
47 # stdout: foobar
48
49 ### Var length
50 FOO=bar
51 echo "foo${#FOO}"
52 # stdout: foo3
53
54 ### Storing backslashes and then echoing them
55 # This is a bug fix; it used to cause problems with unescaping.
56 one='\'
57 two='\\'
58 echo $one $two
59 echo "$one" "$two"
60 ## STDOUT:
61 \ \\
62 \ \\
63 ## END
64 ## BUG dash/mksh STDOUT:
65 \ \
66 \ \
67 # END
68
69 ### Backslash escapes
70 echo \$ \| \a \b \c \d \\
71 # stdout: $ | a b c d \
72
73 ### Backslash escapes inside double quoted string
74 echo "\$ \\ \\ \p \q"
75 # stdout: $ \ \ \p \q
76
77 ### C-style backslash escapes inside double quoted string
78 # mksh and dash implement POSIX incompatible extensions. $ ` " \ <newline>
79 # are the only special ones
80 echo "\a \b"
81 # stdout: \a \b
82 # BUG dash/mksh stdout-json: "\u0007 \u0008\n"
83
84 # BUG
85
86 ### Literal $
87 echo $
88 # stdout: $
89
90 ### Quoted Literal $
91 echo $ "$" $
92 # stdout: $ $ $
93
94 ### Line continuation
95 echo foo\
96 $
97 # stdout: foo$
98
99 ### Line continuation inside double quotes
100 echo "foo\
101 $"
102 # stdout: foo$
103
104 ### $? split over multiple lines
105 # Same with $$, etc. OSH won't do this because $? is a single token.
106 echo $\
107 ?
108 # stdout: $?
109 # OK bash/mksh stdout: 0
110
111 #
112 # Bad quotes
113 #
114
115 # TODO: Also test unterminated quotes inside ${} and $()
116
117 ### Unterminated single quote
118 # code: ls foo bar '
119 # status: 2
120 # OK mksh status: 1
121
122 ### Unterminated double quote
123 # code: ls foo bar "
124 # status: 2
125 # OK mksh status: 1
126
127
128 #
129 # TODO: Might be another section?
130 #
131
132 ### Semicolon
133 echo separated; echo by semi-colon
134 # stdout-json: "separated\nby semi-colon\n"
135
136 #
137 # TODO: Variable substitution operators.
138 #
139
140 ### No tab escapes within single quotes
141 # dash and mksh allow this, which is a BUG.
142 # POSIX says: "Enclosing characters in single-quotes ( '' ) shall preserve the
143 # literal value of each character within the single-quotes. A single-quote
144 # cannot occur within single-quotes"
145 echo 'a\tb'
146 # stdout: a\tb
147 # BUG dash/mksh stdout-json: "a\tb\n"
148
149 # See if it supports ANSI C escapes. Bash supports this, but dash does NOT. I
150 # guess dash you would do IFS=$(printf '\n\t')
151
152 ### $''
153 echo $'foo'
154 # stdout: foo
155 # N-I dash stdout: $foo
156
157 ### $'' with quotes
158 echo $'single \' double \"'
159 # stdout: single ' double "
160 # N-I dash stdout-json: ""
161 # N-I dash status: 2
162
163 ### $'' with newlines
164 echo $'col1\ncol2\ncol3'
165 # stdout-json: "col1\ncol2\ncol3\n"
166 # In dash, \n is special within single quotes
167 # N-I dash stdout-json: "$col1\ncol2\ncol3\n"
168
169 ### $'' octal escapes don't have leading 0
170 # echo -e syntax is echo -e \0377
171 echo -n $'\001' $'\377' | od -A n -c | sed 's/ \+/ /g'
172 ## STDOUT:
173 001 377
174 ## END
175 ## N-I dash STDOUT:
176 $ 001 $ 377
177 ## END
178 ## BUG ash STDOUT:
179 001 0O7
180 ## END
181
182 ### $'' octal escapes with fewer than 3 chars
183 echo $'\1 \11 \11 \111' | od -A n -c | sed 's/ \+/ /g'
184 ## STDOUT:
185 001 \t \t I \n
186 ## END
187 ## N-I dash STDOUT:
188 $ 001 \t \t I \n
189 ## END
190
191 ### $""
192 echo $"foo"
193 # stdout: foo
194 # N-I dash/ash stdout: $foo
195
196 ### printf
197 # This accepts \t by itself, hm.
198 printf "c1\tc2\nc3\tc4\n"
199 # stdout-json: "c1\tc2\nc3\tc4\n"