Subject: Re: ksh patterns
To: None <netbsd-users@netbsd.org>
From: matthew sporleder <msporleder@gmail.com>
List: netbsd-users
Date: 09/19/2007 15:40:23
On 9/19/07, matthew sporleder <msporleder@gmail.com> wrote:
> On 9/19/07, Martin Bock <ixel@gmx.de> wrote:
> > Hello!
> >
> > I am having trouble to understand ksh behaviour in context of patterns,
> > parameters and the case-statements:
> >
> > The following is what I expected:
> > ------------------------------------------------
> > $ cat script1.sh
> > #!/bin/ksh
> > for file in foo bar baz; do
> > case $file in
> > foo) echo foo;;
> > baz|bar) echo ba;;
> > *) echo default;;
> > esac
> > done
> > $ ksh script.sh
> > foo
> > ba
> > ba
> > ------------------------------------------------
> >
> > But with a minor modification it does not work as expected:
> > ------------------------------------------------
> > $ cat script2.sh
> > #!/bin/ksh
> > foopattern="foo"
> > bapattern="baz|bar"
> > for file in foo bar baz; do
> > case $file in
> > $foopattern) echo foo;;
> > $bapattern) echo ba;;
> > *) echo default;;
> > esac
> > done
> > $ ksh script2.sh
> > foo
> > default
> > default
> > ------------------------------------------------
> > Note the parameters containing the patterns for the case statement.
> > Apparently the | symbol does not do the desired magic within paramters.
> >
> > Now, where is the meaning of the | as in script1.sh explained in ksh(1)?
> > While very common usage, I could not seem to find it after several reads
> > of that manpage.
> >
> > Why does the version in script2.sh not work? In particular the patterns
> > before ) in the case statement are -- according to ksh(1) -- subject to
> > parameter expansion.
> >
> > VWIW, this is NetBSD 3.1
>
> ksh is interpreting the | literally. This works:
> foopattern="foo"
> barpattern="bar"
> bazpattern="baz"
> for file in foo bar baz;
> do
> case $file in
> "${foopattern}") echo foo
> ;;
> "${barpattern}"|"${bazpattern}") echo bar
> ;;
> *) echo default
> ;;
> esac
> done
>
> However, that does not follow the man page:
> "Both the word and the patterns are subject to parameter, command, and
> arithmetic substitution as well as tilde substitution."
>
> No amount of quoting or *(pattern) tricks would work for me, so I
> think you may have a bug here.
>
bash seems to behave the same way as our pdksh in this case.