> > [ ! "$test" -a "$test1" ] && test="papa"; > > This is a test with four arguments, thus the rules are: > > ⢠If $1 is â!â, negate the three-argument test of $2, $3, and $4. > ⢠If $1 is â(â and $4 is â)â, perform the two-argument test of $2 > and $3. > ⢠Otherwise, the results are unspecified. > > Since "$test" -a "$test1" is false, the test comes out as true. > > Using test with a combination of more than one primary operator is not > recommended.
Actually, the Austin group agreed that the combination of ! and -a is inherently ambiguous, as it can either be parsed '( ! $test ) -a $test1' or '! ( $test -a $test1 )' according to the rules quoted above. See this interpretation from last year: http://www.opengroup.org/austin/interps/uploads/40/10043/AI-107.txt > > > I think ,this is a bug in bash.and i test it on many freebsd release 4.11, > > 6.1,6.2 with default bash version,this is same. > > Your /bin/sh is not POSIX compliant. Actually, your /bin/sh very well could be POSIX compliant - you just happened to pick an example that POSIX doesn't nail down, and which is therefore unportable and should not be used. Not to mention that [ $test1 -a $test2 ] is an XSI extension, so your shell need not support it to begin with. -- Eric Blake