183 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Text
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Text
		
	
	
		
			Executable file
		
	
	
	
	
#
 | 
						|
# the test/[ code is tested elsewhere, and the [[...]] just uses the same
 | 
						|
# code.  this tests the special features of [[...]]
 | 
						|
#
 | 
						|
TDIR=/usr/homes/chet
 | 
						|
 | 
						|
# this one is straight out of the ksh88 book
 | 
						|
[[ foo > bar && $PWD -ef . ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
# [[ x ]] is equivalent to [[ -n x ]]
 | 
						|
[[ x ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
# [[ ! x ]] is equivalent to [[ ! -n x ]]
 | 
						|
[[ ! x ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
# ! binds tighter than test/[ -- it binds to a term, not an expression
 | 
						|
[[ ! x || x ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
# parenthesized terms didn't work right until post-2.04
 | 
						|
[[ a ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
[[ (a) ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
[[ -n a ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
[[ (-n a) ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
# unset variables don't need to be quoted
 | 
						|
[[ -n $UNSET ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
[[ -z $UNSET ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
# the ==/= and != operators do pattern matching
 | 
						|
[[ $TDIR == /usr/homes/* ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
# ...but you can quote any part of the pattern to have it matched as a string
 | 
						|
[[ $TDIR == /usr/homes/\* ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
[[ $TDIR == '/usr/homes/*' ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
# if the first part of && fails, the second is not executed
 | 
						|
[[ -n $UNSET && $UNSET == foo ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
[[ -z $UNSET && $UNSET == foo ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
# if the first part of || succeeds, the second is not executed
 | 
						|
[[ -z $UNSET || -d $PWD ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
# if the rhs were executed, it would be an error
 | 
						|
[[ -n $TDIR || $HOME -ef ${H*} ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
[[ -n $TDIR && -z $UNSET || $HOME -ef ${H*} ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
# && has a higher parsing precedence than ||
 | 
						|
[[ -n $TDIR && -n $UNSET || $TDIR -ef . ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
# ...but expressions in parentheses may be used to override precedence rules
 | 
						|
[[ -n $TDIR || -n $UNSET && $PWD -ef xyz ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
[[ ( -n $TDIR || -n $UNSET ) && $PWD -ef xyz ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
# some arithmetic tests for completeness -- see what happens with missing
 | 
						|
# operands, bad expressions, makes sure arguments are evaluated as
 | 
						|
# arithmetic expressions, etc.
 | 
						|
 | 
						|
unset IVAR A
 | 
						|
[[ 7 -gt $IVAR ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
[[ $IVAR -gt 7 ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
IVAR=4
 | 
						|
[[ $IVAR -gt 7 ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
[[ 7 -eq 4+3 ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
[[ 7 -eq 4+ ]] 
 | 
						|
echo returns: $? 
 | 
						|
 | 
						|
IVAR=4+3
 | 
						|
[[ $IVAR -eq 7 ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
A=7
 | 
						|
[[ $IVAR -eq A ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
unset IVAR A
 | 
						|
 | 
						|
# more pattern matching tests
 | 
						|
 | 
						|
[[ $filename == *.c ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
filename=patmatch.c
 | 
						|
 | 
						|
[[ $filename == *.c ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
# the extended globbing features may be used when matching patterns
 | 
						|
shopt -s extglob
 | 
						|
 | 
						|
arg=-7
 | 
						|
 | 
						|
[[ $arg == -+([0-9]) ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
arg=-H
 | 
						|
 | 
						|
[[ $arg == -+([0-9]) ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
arg=+4
 | 
						|
[[ $arg == ++([0-9]) ]]
 | 
						|
echo returns: $?
 | 
						|
 | 
						|
# make sure the null string is never matched if the string is not null
 | 
						|
STR=file.c
 | 
						|
PAT=
 | 
						|
 | 
						|
if [[ $STR = $PAT ]]; then
 | 
						|
        echo oops
 | 
						|
fi
 | 
						|
 | 
						|
# but that if the string is null, a null pattern is matched correctly
 | 
						|
STR=
 | 
						|
PAT=
 | 
						|
 | 
						|
if [[ $STR = $PAT ]]; then
 | 
						|
        echo ok
 | 
						|
fi
 | 
						|
 | 
						|
# test the regular expression conditional operator
 | 
						|
[[ jbig2dec-0.9-i586-001.tgz =~ ([^-]+)-([^-]+)-([^-]+)-0*([1-9][0-9]*)\.tgz ]]
 | 
						|
echo ${BASH_REMATCH[1]}
 | 
						|
 | 
						|
# this shouldn't echo anything
 | 
						|
[[ jbig2dec-0.9-i586-001.tgz =~ \([^-]+\)-\([^-]+\)-\([^-]+\)-0*\([1-9][0-9]*\)\.tgz ]]
 | 
						|
echo ${BASH_REMATCH[1]}
 | 
						|
 | 
						|
LDD_BASH="       linux-gate.so.1 =>  (0xffffe000)
 | 
						|
       libreadline.so.5 => /lib/libreadline.so.5 (0xb7f91000)
 | 
						|
       libhistory.so.5 => /lib/libhistory.so.5 (0xb7f8a000)
 | 
						|
       libncurses.so.5 => /lib/libncurses.so.5 (0xb7f55000)
 | 
						|
       libdl.so.2 => /lib/libdl.so.2 (0xb7f51000)
 | 
						|
       libc.so.6 => /lib/libc.so.6 (0xb7e34000)
 | 
						|
       /lib/ld-linux.so.2 (0xb7fd0000)"
 | 
						|
 | 
						|
[[ "$LDD_BASH" =~ "libc" ]] && echo "found 1" 
 | 
						|
echo ${BASH_REMATCH[@]}
 | 
						|
 | 
						|
[[ "$LDD_BASH" =~ libc ]] && echo "found 2" 
 | 
						|
echo ${BASH_REMATCH[@]}
 | 
						|
 | 
						|
# bug in all versions up to and including bash-2.05b
 | 
						|
if [[ "123abc" == *?(a)bc ]]; then echo ok 42; else echo bad 42; fi
 | 
						|
if [[ "123abc" == *?(a)bc ]]; then echo ok 43; else echo bad 43; fi
 | 
						|
 | 
						|
${THIS_SH} ./cond-regexp.sub
 |