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" |