1 | #
|
2 | # Test the length oeprator, which dash supports. Dash doesn't support most
|
3 | # other ops.
|
4 |
|
5 | #### String length
|
6 | v=foo
|
7 | echo ${#v}
|
8 | ## stdout: 3
|
9 |
|
10 | #### Unicode string length (UTF-8)
|
11 | v=$'_\u03bc_'
|
12 | echo ${#v}
|
13 | ## stdout: 3
|
14 | ## N-I dash stdout: 9
|
15 | ## N-I mksh stdout: 4
|
16 |
|
17 | #### Unicode string length (spec/testdata/utf8-chars.txt)
|
18 | v=$(cat $REPO_ROOT/spec/testdata/utf8-chars.txt)
|
19 | echo ${#v}
|
20 | ## stdout: 7
|
21 | ## N-I dash stdout: 13
|
22 | ## N-I mksh stdout: 13
|
23 |
|
24 | #### String length with incomplete utf-8
|
25 | for num_bytes in 0 1 2 3 4 5 6 7 8 9 10 11 12 13; do
|
26 | s=$(head -c $num_bytes $REPO_ROOT/spec/testdata/utf8-chars.txt)
|
27 | echo ${#s}
|
28 | done 2> $TMP/err.txt
|
29 |
|
30 | grep 'warning:' $TMP/err.txt
|
31 | true # exit 0
|
32 |
|
33 | ## STDOUT:
|
34 | 0
|
35 | 1
|
36 | 2
|
37 | -1
|
38 | 3
|
39 | 4
|
40 | -1
|
41 | -1
|
42 | 5
|
43 | 6
|
44 | -1
|
45 | -1
|
46 | -1
|
47 | 7
|
48 | [ stdin ]:3: warning: UTF-8 Error: Truncated Bytes at byte index 2 in string of length 3
|
49 | [ stdin ]:3: warning: UTF-8 Error: Truncated Bytes at byte index 5 in string of length 6
|
50 | [ stdin ]:3: warning: UTF-8 Error: Truncated Bytes at byte index 5 in string of length 7
|
51 | [ stdin ]:3: warning: UTF-8 Error: Truncated Bytes at byte index 9 in string of length 10
|
52 | [ stdin ]:3: warning: UTF-8 Error: Truncated Bytes at byte index 9 in string of length 11
|
53 | [ stdin ]:3: warning: UTF-8 Error: Truncated Bytes at byte index 9 in string of length 12
|
54 | ## END
|
55 | # zsh behavior actually matches bash!
|
56 | ## BUG bash/zsh stderr-json: ""
|
57 | ## BUG bash/zsh STDOUT:
|
58 | 0
|
59 | 1
|
60 | 2
|
61 | 3
|
62 | 3
|
63 | 4
|
64 | 5
|
65 | 6
|
66 | 5
|
67 | 6
|
68 | 7
|
69 | 8
|
70 | 9
|
71 | 7
|
72 | ## END
|
73 | ## BUG dash/mksh stderr-json: ""
|
74 | ## N-I dash/mksh STDOUT:
|
75 | 0
|
76 | 1
|
77 | 2
|
78 | 3
|
79 | 4
|
80 | 5
|
81 | 6
|
82 | 7
|
83 | 8
|
84 | 9
|
85 | 10
|
86 | 11
|
87 | 12
|
88 | 13
|
89 | ## END
|
90 |
|
91 | #### String length with invalid utf-8 continuation bytes
|
92 | for num_bytes in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14; do
|
93 | s=$(head -c $num_bytes $REPO_ROOT/spec/testdata/utf8-chars.txt)$(echo -e "\xFF")
|
94 | echo ${#s}
|
95 | done 2> $TMP/err.txt
|
96 |
|
97 | grep 'warning:' $TMP/err.txt
|
98 | true
|
99 |
|
100 | ## STDOUT:
|
101 | -1
|
102 | -1
|
103 | -1
|
104 | -1
|
105 | -1
|
106 | -1
|
107 | -1
|
108 | -1
|
109 | -1
|
110 | -1
|
111 | -1
|
112 | -1
|
113 | -1
|
114 | -1
|
115 | -1
|
116 | [ stdin ]:3: warning: UTF-8 Error: Bad Encoding at byte index 0 in string of length 1
|
117 | [ stdin ]:3: warning: UTF-8 Error: Bad Encoding at byte index 1 in string of length 2
|
118 | [ stdin ]:3: warning: UTF-8 Error: Bad Encoding at byte index 2 in string of length 3
|
119 | [ stdin ]:3: warning: UTF-8 Error: Bad Encoding at byte index 2 in string of length 4
|
120 | [ stdin ]:3: warning: UTF-8 Error: Bad Encoding at byte index 4 in string of length 5
|
121 | [ stdin ]:3: warning: UTF-8 Error: Bad Encoding at byte index 5 in string of length 6
|
122 | [ stdin ]:3: warning: UTF-8 Error: Bad Encoding at byte index 5 in string of length 7
|
123 | [ stdin ]:3: warning: UTF-8 Error: Bad Encoding at byte index 5 in string of length 8
|
124 | [ stdin ]:3: warning: UTF-8 Error: Bad Encoding at byte index 8 in string of length 9
|
125 | [ stdin ]:3: warning: UTF-8 Error: Bad Encoding at byte index 9 in string of length 10
|
126 | [ stdin ]:3: warning: UTF-8 Error: Bad Encoding at byte index 9 in string of length 11
|
127 | [ stdin ]:3: warning: UTF-8 Error: Bad Encoding at byte index 9 in string of length 12
|
128 | [ stdin ]:3: warning: UTF-8 Error: Bad Encoding at byte index 9 in string of length 13
|
129 | [ stdin ]:3: warning: UTF-8 Error: Bad Encoding at byte index 13 in string of length 14
|
130 | [ stdin ]:3: warning: UTF-8 Error: Bad Encoding at byte index 13 in string of length 14
|
131 | ## END
|
132 | ## BUG bash/zsh stderr-json: ""
|
133 | ## BUG bash/zsh STDOUT:
|
134 | 1
|
135 | 2
|
136 | 3
|
137 | 4
|
138 | 4
|
139 | 5
|
140 | 6
|
141 | 7
|
142 | 6
|
143 | 7
|
144 | 8
|
145 | 9
|
146 | 10
|
147 | 8
|
148 | 8
|
149 | ## N-I dash stderr-json: ""
|
150 | ## N-I dash STDOUT:
|
151 | 7
|
152 | 8
|
153 | 9
|
154 | 10
|
155 | 11
|
156 | 12
|
157 | 13
|
158 | 14
|
159 | 15
|
160 | 16
|
161 | 17
|
162 | 18
|
163 | 19
|
164 | 20
|
165 | 20
|
166 | ## END
|
167 | ## N-I mksh stderr-json: ""
|
168 | ## N-I mksh STDOUT:
|
169 | 1
|
170 | 2
|
171 | 3
|
172 | 4
|
173 | 5
|
174 | 6
|
175 | 7
|
176 | 8
|
177 | 9
|
178 | 10
|
179 | 11
|
180 | 12
|
181 | 13
|
182 | 14
|
183 | 14
|
184 | ## END
|
185 |
|
186 | #### Length of undefined variable
|
187 | echo ${#undef}
|
188 | ## stdout: 0
|
189 |
|
190 | #### Length of undefined variable with nounset
|
191 | set -o nounset
|
192 | echo ${#undef}
|
193 | ## status: 1
|
194 | ## OK dash status: 2
|
195 |
|
196 | #### Length operator can't be followed by test operator
|
197 | echo ${#x-default}
|
198 |
|
199 | x=''
|
200 | echo ${#x-default}
|
201 |
|
202 | x='foo'
|
203 | echo ${#x-default}
|
204 |
|
205 | ## status: 2
|
206 | ## OK bash/mksh status: 1
|
207 | ## stdout-json: ""
|
208 | ## BUG zsh status: 0
|
209 | ## BUG zsh STDOUT:
|
210 | 7
|
211 | 0
|
212 | 3
|
213 | ## END
|
214 | ## BUG dash status: 0
|
215 | ## BUG dash STDOUT:
|
216 | 0
|
217 | 0
|
218 | 3
|
219 | ## END
|