219 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			219 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #
 | |
| # varenv.sh
 | |
| #
 | |
| # Test the behavior of the shell with respect to variable and environment
 | |
| # assignments
 | |
| #
 | |
| expect()
 | |
| {
 | |
| 	echo expect "$@"
 | |
| }
 | |
| 
 | |
| a=1
 | |
| b=2
 | |
| c=3
 | |
| d=4
 | |
| e=5
 | |
| f=6 g=7 h=8
 | |
| 
 | |
| a=3 b=4 $CHMOD $MODE $FN
 | |
| 
 | |
| # This should echo "3 4" according to Posix.2
 | |
| expect "3 4"
 | |
| echo $a $b
 | |
| 
 | |
| set -k
 | |
| 
 | |
| # Assignment statements made when no words are left affect the shell's
 | |
| # environment
 | |
| a=5 b=6 $CHMOD c=7 $MODE d=8 $FN e=9
 | |
| 
 | |
| expect "5 6 7 8 9"
 | |
| echo $a $b $c $d $e
 | |
| 
 | |
| $CHMOD f=7 $MODE g=8 $FN h=9
 | |
| expect "7 8 9"
 | |
| echo $f $g $h
 | |
| 
 | |
| set +k
 | |
| 
 | |
| # The temporary environment does not affect variable expansion, only the
 | |
| # environment given to the command
 | |
| 
 | |
| export HOME=/usr/chet
 | |
| expect $HOME
 | |
| echo $HOME
 | |
| 
 | |
| expect $HOME
 | |
| HOME=/a/b/c /bin/echo $HOME
 | |
| 
 | |
| expect $HOME
 | |
| echo $HOME
 | |
| 
 | |
| # This should echo /a/b/c
 | |
| expect /a/b/c
 | |
| HOME=/a/b/c printenv HOME
 | |
| 
 | |
| set -k
 | |
| 
 | |
| # This should echo $HOME 9, NOT /a/b/c 9
 | |
| 
 | |
| expect "$HOME"
 | |
| HOME=/a/b/c /bin/echo $HOME c=9
 | |
| expect "$HOME 7"
 | |
| echo $HOME $c
 | |
| 
 | |
| # I claim the next two echo calls should give identical output.
 | |
| # ksh agrees, the System V.3 sh does not
 | |
| 
 | |
| expect "/a/b/c 9 /a/b/c"
 | |
| HOME=/a/b/c $ECHO a=$HOME c=9
 | |
| echo $HOME $c $a
 | |
| 
 | |
| expect "/a/b/c 9 /a/b/c"
 | |
| HOME=/a/b/c a=$HOME c=9
 | |
| echo $HOME $c $a
 | |
| set +k
 | |
| 
 | |
| # How do assignment statements affect subsequent assignments on the same
 | |
| # line?
 | |
| expect "/a/b/c /a/b/c"
 | |
| HOME=/a/b/c a=$HOME
 | |
| echo $HOME $a
 | |
| 
 | |
| # The system V.3 sh does this wrong; the last echo should output "1 1",
 | |
| # but the system V.3 sh has it output "2 2".  Posix.2 says the assignment
 | |
| # statements are processed left-to-right.  bash and ksh output the right
 | |
| # thing
 | |
| c=1
 | |
| d=2
 | |
| expect "1 2"
 | |
| echo $c $d
 | |
| d=$c c=$d
 | |
| expect "1 1"
 | |
| echo $c $d
 | |
| 
 | |
| # just for completeness
 | |
| unset d c
 | |
| expect unset
 | |
| echo ${d-unset}
 | |
| 
 | |
| # no output
 | |
| export a
 | |
| a=bcde
 | |
| export a
 | |
| /bin/true 2>/dev/null
 | |
| 
 | |
| func()
 | |
| {
 | |
| 	local YYZ
 | |
| 
 | |
| 	YYZ="song by rush"
 | |
| 	echo $YYZ
 | |
| 	echo $A
 | |
| }
 | |
| 
 | |
| YYZ="toronto airport"
 | |
| A="AVAR"
 | |
| echo $YYZ
 | |
| echo $A
 | |
| A=BVAR func
 | |
| echo $YYZ
 | |
| echo $A
 | |
| 
 | |
| export A
 | |
| # Make sure expansion doesn't use assignment statements preceding a builtin
 | |
| A=ZVAR echo $A
 | |
| 
 | |
| XPATH=/bin:/usr/bin:/usr/local/bin:.
 | |
| func2()
 | |
| {
 | |
| 	local z=yy
 | |
| 	local -a avar=( ${XPATH//: } )
 | |
| 	echo ${avar[@]}
 | |
| 	local
 | |
| }
 | |
| 
 | |
| avar=42
 | |
| echo $avar
 | |
| func2
 | |
| echo $avar
 | |
| 
 | |
| # try to set an attribute for an unset variable; make sure it persists
 | |
| # when the variable is assigned a value
 | |
| declare -i ivar
 | |
| 
 | |
| ivar=10
 | |
| 
 | |
| declare -p ivar
 | |
| unset ivar
 | |
| 
 | |
| # export an unset variable, make sure it is not suddenly set, but make
 | |
| # sure the export attribute persists when the variable is assigned a
 | |
| # value
 | |
| export ivar
 | |
| echo ${ivar-unset}
 | |
| 
 | |
| ivar=42
 | |
| declare -p ivar
 | |
| 
 | |
| # make sure set [-+]o ignoreeof and $IGNOREEOF are reflected
 | |
| unset IGNOREEOF
 | |
| set +o ignoreeof
 | |
| set -o ignoreeof
 | |
| if [ "$IGNOREEOF" -ne 10 ]; then
 | |
| 	echo "./varenv.sh: set -o ignoreeof is not reflected in IGNOREEOF" >&2
 | |
| fi
 | |
| unset IGNOREEOF
 | |
| set +o ignoreeof
 | |
| 
 | |
| # older versions of bash used to not reset RANDOM in subshells correctly
 | |
| [[ $RANDOM -eq $(echo $RANDOM) ]] && echo "RANDOM: problem with subshells"
 | |
| 
 | |
| # make sure that shopt -o is reflected in $SHELLOPTS
 | |
| # first, get rid of things that might be set automatically via shell
 | |
| # variables
 | |
| set +o posix
 | |
| set +o ignoreeof
 | |
| set +o monitor
 | |
| echo $-
 | |
| echo ${SHELLOPTS}
 | |
| shopt -so physical
 | |
| echo $-
 | |
| echo ${SHELLOPTS}
 | |
| 
 | |
| # and make sure it is readonly
 | |
| readonly -p | grep SHELLOPTS
 | |
| 
 | |
| # This was an error in bash versions prior to bash-2.04.  The `set -a'
 | |
| # should cause the assignment statement that's an argument to typeset
 | |
| # to create an exported variable
 | |
| unset FOOFOO
 | |
| FOOFOO=bar
 | |
| set -a
 | |
| typeset FOOFOO=abcde
 | |
| 
 | |
| printenv FOOFOO
 | |
| 
 | |
| # test out export behavior of variable assignments preceding builtins and
 | |
| # functions
 | |
| $THIS_SH ./varenv1.sub
 | |
| 
 | |
| # more tests; bugs in bash up to version 2.05a
 | |
| $THIS_SH ./varenv2.sub
 | |
| 
 | |
| # more tests; bugs in bash IFS scoping up through version 4.2
 | |
| $THIS_SH ./varenv3.sub
 | |
| 
 | |
| # scoping problems with declare -g through bash-4.2
 | |
| ${THIS_SH} ./varenv4.sub
 | |
| 
 | |
| # more scoping and declaration problems with -g and arrays through bash-4.2
 | |
| ${THIS_SH} ./varenv5.sub
 | |
| 
 | |
| # variable scoping in the presence of nameref
 | |
| ${THIS_SH} ./varenv6.sub
 | |
| 
 | |
| # make sure variable scoping is done right
 | |
| tt() { typeset a=b;echo a=$a; };a=z;echo a=$a;tt;echo a=$a
 | |
| 
 | 
