[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: quote removal issues within character class
From: |
Chet Ramey |
Subject: |
Re: quote removal issues within character class |
Date: |
Wed, 13 Nov 2019 09:56:57 -0500 |
User-agent: |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:68.0) Gecko/20100101 Thunderbird/68.2.2 |
On 11/8/19 4:50 PM, Oğuz wrote:
v=foo
echo ${v#[[:"lower":]]}
should print oo, but it prints foo instead. This is reproducible on bash
4.4
Plus
case foo in (*[![:"lower":]]*) echo bar; esac
prints bar, while
The idea is that at this point in command processing, quote removal hasn't
been performed. According to the abstract model the shell uses for word
expansions, that means the double quotes are still present in the word, and
`"lower"' is not the same as `lower'.
There was a recent extensive discussion of this and other points on the
posix mailing list, and, as kre said, the committee has decided to make
this a special case. I changed this about a month ago, and the chage is
in the devel branch.
case foo in (*[![":lower":]]*) echo bar; esac
doesn't print anything. And this is only reproducible on bash >5.0
This is an invalid character class, since a class has to begin with the
two-character sequence `[:'. The intervening double quote causes that test
to fail (this case is not so special, it seems). The first `]' then
terminates the bracket expression, so th string has to contain at least
a `]' to have a possibility of matching.
--
``The lyf so short, the craft so long to lerne.'' - Chaucer
``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, UTech, CWRU chet@case.edu http://tiswww.cwru.edu/~chet/
Re: quote removal issues within character class,
Chet Ramey <=