Subject: Re: ksh patterns
To: None <netbsd-users@netbsd.org>
From: matthew sporleder <msporleder@gmail.com>
List: netbsd-users
Date: 09/19/2007 15:37:32
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.