Unless I'm misinterpreting the specification, it seems like dash doesn't
handle pattern matching in case statements correctly. The following
sample demonstrates the issue:
#!/bin/sh -eu
while read -r line
do
case "$line" in
[:space:]*:)
echo "a"
;;
*:)
echo "b"
;;
*)
echo "c"
;;
esac
done <<EOF
libgit2 policy:
0.27.8-r0:
lib/apk/db/installed
https://mirror.sr.ht/alpine/sr.ht/
EOF
The expected output is b a c c, but the output in practice is b b c c.
Quoting the spec:
> http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04_05
>
> ...case shall execute the compound-list corresponding to the first one of
> several patterns (see Pattern Matching Notation)...
>
> http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13
>
> ...patterns matching a single character shall match a single character:
> ordinary characters, special pattern characters, and pattern bracket
> expressions...
>
> ...an open bracket... shall introduce a pattern bracket expression... as in
> XBD RE Bracket Expression...
>
> http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05
>
> ...The following character class expressions shall be supported in all
> locales:
>
> [:space:]
Am I misinterpreting the spec or is this indeed a problem with dash? In
addition to this issue, the following example cause a parsing error:
[ \t])
Both problems can be reproduced with bash.