On Wednesday 04 Aug 2010 09:06:16 Linda Walsh wrote: > On 8/1/2010 8:11 PM, Chris F.A. Johnson wrote: > > On Sun, 1 Aug 2010, Linda Walsh wrote: > >> I have: > >> > >> w="/home/law/bin/package: line 5: type: xx: not found" > >> > >> The =~ operator is suppose to use the RH Expr as a ext.-regex. > >> > >> So why doesn't this match and print "not found"? > >> > >> if [[ $w =~ ".*not found.*" ]]; then echo "not found"; fi > >> > >> It prints nothing. Seems like such a basic concept. Sorry, this > >> newbie needs help on such trivial matters. :-( > >> > > When quoted, the right-hand argument is matched as a string, not an > > expression. > > So that's how it is... > > Aren't single quotes reserved for making things literal, while > double quotes are used for grouping, yet interpreting what is between them > (expansions and such). > > Is there a reason "RH =~" was made inconsistent regarding this practice? > > I might note: the man page makes no reference to such heinous behavior, > leading one me to think I'd use single quotes if I didn't want the > contents to be 'active' Though to tell the truth. Technically, it says: > > An additional binary operator, =~, is available, with the same > precedence as == and !=. When it is used, the string to the > right of the operator is considered an extended regular expres- > sion and matched accordingly (as in regex(3)). > > I don't see anything about quotes making the =~ operator behave like > the == operator. I'm not sure I see the usefulness in that. > If there is, then is it necessary to reserving both single and double > quotes to make "=~" behave like "=="?
From the Changelog: This document details the changes between this version, bash-3.2-alpha, and the previous version, bash-3.1-release. ... 3. New Features in Bash ... f. Quoting the string argument to the [[ command's =~ operator now forces string matching, as with the other pattern-matching operators. From the file COMPAT: 33. Bash-3.2 adopts the convention used by other string and pattern matching operators for the `[[' compound command, and matches any quoted portion of the right-hand-side argument to the =~ operator as a string rather than a regular expression. 34. Bash-4.0 allows the behavior in the previous item to be modified using the notion of a shell `compatibility level'. Finally, to set a given compatibility level, one uses shopt -s compat31 This is in the man page: compat31 If set, bash changes its behavior to that of version 3.1 with respect to quoted arguments to the conditional command's =~ operator. So your example would have worked with "shopt -s compat31". -- D.