Geoff Clare <g...@opengroup.org> wrote: > > > > > ["a\-c"] the backslash is not special and should be treated literally > > > > This string is converted into [\a\\-\c] by the shell macro expansion code. > > > > With the shell gmatch() code, this results in a match for 'a' and '\\' .. > > 'c'. > > Huh? The '-' is quoted by the double quotes and should therefore be > treated literally. It should match only 'a', backslash, '-' and 'c' > (and that's what I observe in bash, although ksh88 for some reason only > matches 'a', backslash and 'c' which looks like a bug).

You are right, Sorry, I missed one backslash before the '-'. The resulting pattern is: [\a\\\-\c] Here is an updated script "tsh": ------------- if [ "$BASH_VERSION" != "" ]; then echo() { command echo -e "$@"; } fi chk() { echo [a-c] ["a-c"] ["a\-c"] [\a\-\c] [a\-c]; } mkdir td && cd td || exit printf '%s\n' '---> [a-c] ["a-c"] ["a\-c"] [\a\-\c] [a\-c]' echo ": \c"; chk :> a; echo "a: \c"; chk; rm a :> b; echo "b: \c"; chk; rm b :> ./-; echo "-: \c"; chk; rm ./- :> c; echo "c: \c"; chk; rm c :> _; echo "_: \c"; chk; rm _ :> \\; echo "\\: \c"; chk; rm \\ :> d; echo "d: \c"; chk; rm d rm -f * cd .. rmdir td ------------- and with: for i in sh ksh ksh93 bosh bash mksh dash; do echo; echo $i:; $i ./tsh; done you get this result: sh: ---> [a-c] ["a-c"] ["a\-c"] [\a\-\c] [a\-c] : [a-c] [a-c] [a\-c] [a-c] [a-c] a: a a a a a b: b [a-c] [a\-c] [a-c] [a-c] -: [a-c] - - - - c: c c c c c _: [a-c] [a-c] [a\-c] [a-c] [a-c] \: [a-c] [a-c] \ [a-c] [a-c] d: [a-c] [a-c] [a\-c] [a-c] [a-c] ksh: ---> [a-c] ["a-c"] ["a\-c"] [\a\-\c] [a\-c] : [a-c] [a-c] [a\-c] [a-c] [a-c] a: a a a a a b: b [a-c] [a\-c] [a-c] b -: [a-c] [a-c] [a\-c] [a-c] [a-c] c: c c c c c _: [a-c] [a-c] [a\-c] [a-c] [a-c] \: [a-c] \ \ \ \ d: [a-c] [a-c] [a\-c] [a-c] [a-c] ksh93: ---> [a-c] ["a-c"] ["a\-c"] [\a\-\c] [a\-c] : [a-c] [a-c] [a\-c] [a-c] [a-c] a: a a a a a b: b b b [a-c] [a-c] -: [a-c] [a-c] [a\-c] - - c: c c c c c _: [a-c] [a-c] [a\-c] [a-c] [a-c] \: [a-c] [a-c] \ [a-c] [a-c] d: [a-c] [a-c] [a\-c] [a-c] [a-c] bosh: ---> [a-c] ["a-c"] ["a\-c"] [\a\-\c] [a\-c] : [a-c] [a-c] [a\-c] [a-c] [a-c] a: a a a a a b: b [a-c] [a\-c] [a-c] [a-c] -: [a-c] - - - - c: c c c c c _: [a-c] [a-c] [a\-c] [a-c] [a-c] \: [a-c] [a-c] \ [a-c] [a-c] d: [a-c] [a-c] [a\-c] [a-c] [a-c] bash: ---> [a-c] ["a-c"] ["a\-c"] [\a\-\c] [a\-c] : [a-c] [a-c] [a\-c] [a-c] [a-c] a: a a a a a b: b [a-c] [a\-c] [a-c] [a-c] -: [a-c] - - - - c: c c c c c _: [a-c] [a-c] [a\-c] [a-c] [a-c] \: [a-c] [a-c] \ [a-c] [a-c] d: [a-c] [a-c] [a\-c] [a-c] [a-c] mksh: ---> [a-c] ["a-c"] ["a\-c"] [\a\-\c] [a\-c] : [a-c] [a-c] [a\-c] [a-c] [a-c] a: a a a a a b: b [a-c] [a\-c] [a-c] [a-c] -: [a-c] - - - - c: c c c c c _: [a-c] [a-c] [a\-c] [a-c] [a-c] \: [a-c] [a-c] \ [a-c] [a-c] d: [a-c] [a-c] [a\-c] [a-c] [a-c] dash: ---> [a-c] ["a-c"] ["a\-c"] [\a\-\c] [a\-c] : [a-c] [a-c] [a\-c] [a-c] [a-c] a: a a a a a b: b [a-c] b [a-c] [a-c] -: [a-c] - [a\-c] - - c: c c c c c _: [a-c] [a-c] _ [a-c] [a-c] \: [a-c] [a-c] \ [a-c] [a-c] d: [a-c] [a-c] [a\-c] [a-c] [a-c] So there is a new bug in "dash", as dash matches '_' for your example and '_' is inside the range '\\' .. 'c'. Jörg -- EMail:jo...@schily.net (home) Jörg Schilling D-13353 Berlin joerg.schill...@fokus.fraunhofer.de (work) Blog: http://schily.blogspot.com/ URL: http://cdrecord.org/private/ http://sf.net/projects/schilytools/files/'