#!/bin/sh
 
X='[foo'
case "$X" in
[*) echo match;;
*)  echo unmatch;;
esac
 
echo "remove prefix: '${X#[}'"
case remove prefix
bash match 'foo'
ash match 'foo'
dash unmatch '[foo'
ksh unmatch 'foo'
zsh bad pattern: [* bad pattern: [ '

パターンのところに閉じ括弧のない [ がきたら [ にマッチしてほしい、じゃなかったら構文エラーじゃないか?ということからいろいろ議論が発展したが、どうやら単独の[は[自身にマッチすると言う記述はあるらしい。単独じゃない[については議論の終着点がよくわからん。

でdashだけ挙動がおかしいのでソースコードをみてみたら、どうもバグってるんじゃないか?こんな感じのパッチを当てたら[自身にマッチするようになった。

--- dash-0.5.8-orig/src/expand.c        2014-09-28 17:19:32.000000000 +0900
+++ dash-0.5.8-koie/src/expand.c        2016-01-31 23:40:13.903174483 +0900
@@ -1549,7 +1549,8 @@ pmatch(const char *pattern, const char *
                        do {
                                if (!c) {
                                        p = startp;
-                                       c = *p;
+                                       c = p[-1];
+                                       q--;
                                        goto dft;
                                }
                                if (c == '[') {

koie