xref: /onnv-gate/usr/src/lib/libshell/common/tests/vartree2.sh (revision 12068:08a39a083754)
18462SApril.Chin@Sun.COM########################################################################
28462SApril.Chin@Sun.COM#                                                                      #
38462SApril.Chin@Sun.COM#               This software is part of the ast package               #
4*12068SRoger.Faulkner@Oracle.COM#          Copyright (c) 1982-2010 AT&T Intellectual Property          #
58462SApril.Chin@Sun.COM#                      and is licensed under the                       #
68462SApril.Chin@Sun.COM#                  Common Public License, Version 1.0                  #
78462SApril.Chin@Sun.COM#                    by AT&T Intellectual Property                     #
88462SApril.Chin@Sun.COM#                                                                      #
98462SApril.Chin@Sun.COM#                A copy of the License is available at                 #
108462SApril.Chin@Sun.COM#            http://www.opensource.org/licenses/cpl1.0.txt             #
118462SApril.Chin@Sun.COM#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
128462SApril.Chin@Sun.COM#                                                                      #
138462SApril.Chin@Sun.COM#              Information and Software Systems Research               #
148462SApril.Chin@Sun.COM#                            AT&T Research                             #
158462SApril.Chin@Sun.COM#                           Florham Park NJ                            #
168462SApril.Chin@Sun.COM#                                                                      #
178462SApril.Chin@Sun.COM#                  David Korn <dgk@research.att.com>                   #
188462SApril.Chin@Sun.COM#                                                                      #
198462SApril.Chin@Sun.COM########################################################################
208462SApril.Chin@Sun.COM#
218462SApril.Chin@Sun.COM# variable tree test #002
228462SApril.Chin@Sun.COM# Propose of this test is whether ksh93 handles global variable trees
238462SApril.Chin@Sun.COM# and function-local variable trees the same way, including "nameref"
248462SApril.Chin@Sun.COM# and "unset" handling.
258462SApril.Chin@Sun.COM#
268462SApril.Chin@Sun.COM
278462SApril.Chin@Sun.COMfunction err_exit
288462SApril.Chin@Sun.COM{
298462SApril.Chin@Sun.COM	print -u2 -n "\t"
308462SApril.Chin@Sun.COM	print -u2 -r ${Command}[$1]: "${@:2}"
318462SApril.Chin@Sun.COM	(( Errors+=1 ))
328462SApril.Chin@Sun.COM}
338462SApril.Chin@Sun.COM
348462SApril.Chin@Sun.COMalias err_exit='err_exit $LINENO'
358462SApril.Chin@Sun.COM
368462SApril.Chin@Sun.COM# "built_tree1" and "built_tree2" are identical except the way how they test
3710898Sroland.mainz@nrubsig.org# whether a variable exists:
388462SApril.Chin@Sun.COM# - "built_tree1" uses "${varname}" != "", e.g. looking whether the variable
398462SApril.Chin@Sun.COM#    as non-zero length content
408462SApril.Chin@Sun.COM# - "built_tree2" uses "! (unset varname)", e.g. "unset" in a subshell
418462SApril.Chin@Sun.COMfunction build_tree1
428462SApril.Chin@Sun.COM{
438462SApril.Chin@Sun.COM#set -o errexit -o xtrace
448462SApril.Chin@Sun.COM	typeset index
458462SApril.Chin@Sun.COM	typeset s
468462SApril.Chin@Sun.COM	typeset i
478462SApril.Chin@Sun.COM	typeset dummy
488462SApril.Chin@Sun.COM	typeset a b c d e f
4910898Sroland.mainz@nrubsig.org
508462SApril.Chin@Sun.COM	nameref dest_tree="$1" # destination tree
518462SApril.Chin@Sun.COM	nameref srcdata="$2"   # source data
528462SApril.Chin@Sun.COM	typeset tree_mode="$3" # mode to define the type of leads
538462SApril.Chin@Sun.COM
548462SApril.Chin@Sun.COM	typeset -A dest_tree.l1
558462SApril.Chin@Sun.COM
568462SApril.Chin@Sun.COM	for index in "${!srcdata.hashnodes[@]}" ; do
578462SApril.Chin@Sun.COM		nameref node=srcdata.hashnodes["${index}"]
588462SApril.Chin@Sun.COM
598462SApril.Chin@Sun.COM		for i in "${node.xlfd[@]}" ; do
608462SApril.Chin@Sun.COM			IFS='-' read dummy a b c d e f <<<"$i"
6110898Sroland.mainz@nrubsig.org
628462SApril.Chin@Sun.COM			if [[ "$a" == "" ]] ; then
638462SApril.Chin@Sun.COM				a="$dummy"
648462SApril.Chin@Sun.COM			fi
6510898Sroland.mainz@nrubsig.org
668462SApril.Chin@Sun.COM			[[ "$a" == "" ]] && a='-'
678462SApril.Chin@Sun.COM			[[ "$b" == "" ]] && b='-'
688462SApril.Chin@Sun.COM			[[ "$c" == "" ]] && c='-'
6910898Sroland.mainz@nrubsig.org
708462SApril.Chin@Sun.COM			if [[ "${dest_tree.l1["$a"]}" == "" ]] ; then
718462SApril.Chin@Sun.COM			#if ! (unset dest_tree.l1["$a"]) ; then
728462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2
738462SApril.Chin@Sun.COM			fi
748462SApril.Chin@Sun.COM
758462SApril.Chin@Sun.COM			if [[ "${dest_tree.l1["$a"].l2["$b"]}" == "" ]] ; then
768462SApril.Chin@Sun.COM			#if ! (unset dest_tree.l1["$a"].l2["$b"]) ; then
778462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2["$b"].l3
788462SApril.Chin@Sun.COM			fi
798462SApril.Chin@Sun.COM
808462SApril.Chin@Sun.COM			if [[ "${!dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[*]}" == "" ]] ; then
818462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2["$b"].l3["$c"].entries
828462SApril.Chin@Sun.COM			fi
8310898Sroland.mainz@nrubsig.org
848462SApril.Chin@Sun.COM			typeset new_index
858462SApril.Chin@Sun.COM			if [[ "${tree_mode}" == "leaf_name" ]] ; then
868462SApril.Chin@Sun.COM				new_index=$(( ${#dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[@]}+1 ))
878462SApril.Chin@Sun.COM			else
888462SApril.Chin@Sun.COM				new_index="${node.name}"
898462SApril.Chin@Sun.COM
908462SApril.Chin@Sun.COM				# skip if the leaf node already exists
918462SApril.Chin@Sun.COM				if [[ "${dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}]}" != "" ]] ; then
928462SApril.Chin@Sun.COM					continue
938462SApril.Chin@Sun.COM				fi
948462SApril.Chin@Sun.COM			fi
9510898Sroland.mainz@nrubsig.org
968462SApril.Chin@Sun.COM			add_tree_leaf dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}] "${index}" "${tree_mode}"
978462SApril.Chin@Sun.COM		done
988462SApril.Chin@Sun.COM	done
9910898Sroland.mainz@nrubsig.org
10010898Sroland.mainz@nrubsig.org	return 0
1018462SApril.Chin@Sun.COM}
1028462SApril.Chin@Sun.COM
1038462SApril.Chin@Sun.COM# "built_tree1" and "built_tree2" are identical except the way how they test
10410898Sroland.mainz@nrubsig.org# whether a variable exists:
1058462SApril.Chin@Sun.COM# - "built_tree1" uses "${varname}" != "", e.g. looking whether the variable
1068462SApril.Chin@Sun.COM#    as non-zero length content
1078462SApril.Chin@Sun.COM# - "built_tree2" uses "! (unset varname)", e.g. "unset" in a subshell
1088462SApril.Chin@Sun.COMfunction build_tree2
1098462SApril.Chin@Sun.COM{
1108462SApril.Chin@Sun.COM#set -o errexit -o xtrace
1118462SApril.Chin@Sun.COM	typeset index
1128462SApril.Chin@Sun.COM	typeset s
1138462SApril.Chin@Sun.COM	typeset i
1148462SApril.Chin@Sun.COM	typeset dummy
1158462SApril.Chin@Sun.COM	typeset a b c d e f
11610898Sroland.mainz@nrubsig.org
1178462SApril.Chin@Sun.COM	nameref dest_tree="$1" # destination tree
1188462SApril.Chin@Sun.COM	nameref srcdata="$2"   # source data
1198462SApril.Chin@Sun.COM	typeset tree_mode="$3" # mode to define the type of leads
1208462SApril.Chin@Sun.COM
1218462SApril.Chin@Sun.COM	typeset -A dest_tree.l1
1228462SApril.Chin@Sun.COM
1238462SApril.Chin@Sun.COM	for index in "${!srcdata.hashnodes[@]}" ; do
1248462SApril.Chin@Sun.COM		nameref node=srcdata.hashnodes["${index}"]
1258462SApril.Chin@Sun.COM
1268462SApril.Chin@Sun.COM		for i in "${node.xlfd[@]}" ; do
1278462SApril.Chin@Sun.COM			IFS='-' read dummy a b c d e f <<<"$i"
12810898Sroland.mainz@nrubsig.org
1298462SApril.Chin@Sun.COM			if [[ "$a" == "" ]] ; then
1308462SApril.Chin@Sun.COM				a="$dummy"
1318462SApril.Chin@Sun.COM			fi
13210898Sroland.mainz@nrubsig.org
1338462SApril.Chin@Sun.COM			[[ "$a" == "" ]] && a='-'
1348462SApril.Chin@Sun.COM			[[ "$b" == "" ]] && b='-'
1358462SApril.Chin@Sun.COM			[[ "$c" == "" ]] && c='-'
13610898Sroland.mainz@nrubsig.org
1378462SApril.Chin@Sun.COM			#if [[ "${dest_tree.l1["$a"]}" == "" ]] ; then
1388462SApril.Chin@Sun.COM			if ! (unset dest_tree.l1["$a"]) ; then
1398462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2
1408462SApril.Chin@Sun.COM			fi
1418462SApril.Chin@Sun.COM
1428462SApril.Chin@Sun.COM			#if [[ "${dest_tree.l1["$a"].l2["$b"]}" == "" ]] ; then
1438462SApril.Chin@Sun.COM			if ! (unset dest_tree.l1["$a"].l2["$b"]) ; then
1448462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2["$b"].l3
1458462SApril.Chin@Sun.COM			fi
1468462SApril.Chin@Sun.COM
1478462SApril.Chin@Sun.COM			if [[ "${!dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[*]}" == "" ]] ; then
1488462SApril.Chin@Sun.COM				typeset -A dest_tree.l1["$a"].l2["$b"].l3["$c"].entries
1498462SApril.Chin@Sun.COM			fi
15010898Sroland.mainz@nrubsig.org
1518462SApril.Chin@Sun.COM			typeset new_index
1528462SApril.Chin@Sun.COM			if [[ "${tree_mode}" == "leaf_name" ]] ; then
1538462SApril.Chin@Sun.COM				new_index=$(( ${#dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[@]}+1 ))
1548462SApril.Chin@Sun.COM			else
1558462SApril.Chin@Sun.COM				new_index="${node.name}"
1568462SApril.Chin@Sun.COM
1578462SApril.Chin@Sun.COM				# skip if the leaf node already exists
1588462SApril.Chin@Sun.COM				if [[ "${dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}]}" != "" ]] ; then
1598462SApril.Chin@Sun.COM					continue
1608462SApril.Chin@Sun.COM				fi
1618462SApril.Chin@Sun.COM			fi
16210898Sroland.mainz@nrubsig.org
1638462SApril.Chin@Sun.COM			add_tree_leaf dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}] "${index}" "${tree_mode}"
1648462SApril.Chin@Sun.COM		done
1658462SApril.Chin@Sun.COM	done
16610898Sroland.mainz@nrubsig.org
16710898Sroland.mainz@nrubsig.org	return 0
1688462SApril.Chin@Sun.COM}
1698462SApril.Chin@Sun.COM
1708462SApril.Chin@Sun.COM
1718462SApril.Chin@Sun.COMfunction add_tree_leaf
1728462SApril.Chin@Sun.COM{
1738462SApril.Chin@Sun.COM	nameref tree_leafnode="$1"
1748462SApril.Chin@Sun.COM	nameref data_node=srcdata.hashnodes["$2"]
1758462SApril.Chin@Sun.COM	typeset add_mode="$3"
17610898Sroland.mainz@nrubsig.org
1778462SApril.Chin@Sun.COM	case "${add_mode}" in
1788462SApril.Chin@Sun.COM		"leaf_name")
1798462SApril.Chin@Sun.COM			tree_leafnode="${data_node.name}"
1808462SApril.Chin@Sun.COM			return 0
1818462SApril.Chin@Sun.COM			;;
1828462SApril.Chin@Sun.COM		"leaf_compound")
1838462SApril.Chin@Sun.COM			tree_leafnode=(
1848462SApril.Chin@Sun.COM				typeset name="${data_node.name}"
1858462SApril.Chin@Sun.COM				typeset -a filenames=( "${data_node.filenames[@]}" )
1868462SApril.Chin@Sun.COM				typeset -a comments=( "${data_node.comments[@]}" )
1878462SApril.Chin@Sun.COM				typeset -a xlfd=( "${data_node.xlfd[@]}" )
1888462SApril.Chin@Sun.COM			)
1898462SApril.Chin@Sun.COM			return 0
1908462SApril.Chin@Sun.COM			;;
1918462SApril.Chin@Sun.COM		*)
1928462SApril.Chin@Sun.COM			print -u2 -f "ERROR: Unknown mode %s in add_tree_leaf\n" "${add_mode}"
1938462SApril.Chin@Sun.COM			return 1
1948462SApril.Chin@Sun.COM			;;
1958462SApril.Chin@Sun.COM	esac
19610898Sroland.mainz@nrubsig.org
1978462SApril.Chin@Sun.COM	# not reached
1988462SApril.Chin@Sun.COM	return 1
1998462SApril.Chin@Sun.COM}
2008462SApril.Chin@Sun.COM
2018462SApril.Chin@Sun.COM# "mysrcdata_local" and "mysrcdata_global" must be identical
2028462SApril.Chin@Sun.COMtypeset mysrcdata_global=(
2038462SApril.Chin@Sun.COM	typeset -A hashnodes=(
2048462SApril.Chin@Sun.COM		[abcd]=(
2058462SApril.Chin@Sun.COM			name='abcd'
2068462SApril.Chin@Sun.COM			typeset -a xlfd=(
2078462SApril.Chin@Sun.COM				'-urw-itc zapfchancery-medium-i-normal--0-0-0-0-p-0-iso8859-1'
2088462SApril.Chin@Sun.COM				'-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-adobe-fontspecific'
2098462SApril.Chin@Sun.COM				'-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-sun-fontspecific'
2108462SApril.Chin@Sun.COM			)
2118462SApril.Chin@Sun.COM			typeset -a comments=(
2128462SApril.Chin@Sun.COM				'comment 1'
2138462SApril.Chin@Sun.COM				'comment 2'
2148462SApril.Chin@Sun.COM				'comment 3'
2158462SApril.Chin@Sun.COM			)
2168462SApril.Chin@Sun.COM			typeset -a filenames=(
2178462SApril.Chin@Sun.COM				'/home/foo/abcd_1'
2188462SApril.Chin@Sun.COM				'/home/foo/abcd_2'
2198462SApril.Chin@Sun.COM				'/home/foo/abcd_3'
2208462SApril.Chin@Sun.COM			)
2218462SApril.Chin@Sun.COM		)
2228462SApril.Chin@Sun.COM	)
2238462SApril.Chin@Sun.COM)
2248462SApril.Chin@Sun.COM
2258462SApril.Chin@Sun.COMmytree_global1=()
2268462SApril.Chin@Sun.COMmytree_global2=()
22710898Sroland.mainz@nrubsig.org
2288462SApril.Chin@Sun.COMfunction main
2298462SApril.Chin@Sun.COM{
2308462SApril.Chin@Sun.COM	# "mysrcdata_local" and "mysrcdata_global" must be identical
2318462SApril.Chin@Sun.COM	typeset mysrcdata_local=(
2328462SApril.Chin@Sun.COM		typeset -A hashnodes=(
2338462SApril.Chin@Sun.COM			[abcd]=(
2348462SApril.Chin@Sun.COM				name='abcd'
2358462SApril.Chin@Sun.COM				typeset -a xlfd=(
2368462SApril.Chin@Sun.COM					'-urw-itc zapfchancery-medium-i-normal--0-0-0-0-p-0-iso8859-1'
2378462SApril.Chin@Sun.COM					'-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-adobe-fontspecific'
2388462SApril.Chin@Sun.COM					'-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-sun-fontspecific'
2398462SApril.Chin@Sun.COM				)
2408462SApril.Chin@Sun.COM				typeset -a comments=(
2418462SApril.Chin@Sun.COM					'comment 1'
2428462SApril.Chin@Sun.COM					'comment 2'
2438462SApril.Chin@Sun.COM					'comment 3'
2448462SApril.Chin@Sun.COM				)
2458462SApril.Chin@Sun.COM				typeset -a filenames=(
2468462SApril.Chin@Sun.COM					'/home/foo/abcd_1'
2478462SApril.Chin@Sun.COM					'/home/foo/abcd_2'
2488462SApril.Chin@Sun.COM					'/home/foo/abcd_3'
2498462SApril.Chin@Sun.COM				)
2508462SApril.Chin@Sun.COM			)
2518462SApril.Chin@Sun.COM		)
2528462SApril.Chin@Sun.COM	)
2538462SApril.Chin@Sun.COM
2548462SApril.Chin@Sun.COM	#### Build tree using global tree variables
2558462SApril.Chin@Sun.COM	build_tree1 mytree_global1 mysrcdata_global leaf_compound || \
2568462SApril.Chin@Sun.COM		err_exit 'build_tree1 mytree_global1 mysrcdata_global leaf_compound returned an error'
25710898Sroland.mainz@nrubsig.org	(( $(print -r -- "${mytree_global1}" | wc -l) > 10 )) || err_exit "compound tree 'mytree_global1' too small"
2588462SApril.Chin@Sun.COM
2598462SApril.Chin@Sun.COM	build_tree2 mytree_global2 mysrcdata_global leaf_compound || \
2608462SApril.Chin@Sun.COM		err_exit 'build_tree2 mytree_global2 mysrcdata_global leaf_compound returned an error'
26110898Sroland.mainz@nrubsig.org	(( $(print -r -- "${mytree_global2}" | wc -l) > 10 )) || err_exit "compound tree 'mytree_global2' too small"
2628462SApril.Chin@Sun.COM
2638462SApril.Chin@Sun.COM
2648462SApril.Chin@Sun.COM	#### build tree using local tree variables
2658462SApril.Chin@Sun.COM	mytree_local1=()
2668462SApril.Chin@Sun.COM	mytree_local2=()
2678462SApril.Chin@Sun.COM
2688462SApril.Chin@Sun.COM	build_tree1 mytree_local1 mysrcdata_local leaf_compound || \
2698462SApril.Chin@Sun.COM		err_exit 'build_tree1 mytree_local1 mysrcdata_local leaf_compound returned an error'
27010898Sroland.mainz@nrubsig.org	(( $(print -r -- "${mytree_local1}" | wc -l) > 10 )) || err_exit "compound tree 'mytree_local1' too small"
2718462SApril.Chin@Sun.COM
2728462SApril.Chin@Sun.COM	build_tree2 mytree_local2 mysrcdata_local leaf_compound || \
2738462SApril.Chin@Sun.COM		err_exit 'build_tree2 mytree_local2 mysrcdata_local leaf_compound returned an error'
27410898Sroland.mainz@nrubsig.org	(( $(print -r -- "${mytree_local2}" | wc -l) > 10 )) || err_exit "compound tree 'mytree_local2' too small"
2758462SApril.Chin@Sun.COM
27610898Sroland.mainz@nrubsig.org
2778462SApril.Chin@Sun.COM	#### Compare treess
2788462SApril.Chin@Sun.COM	if [[ "${mytree_global1}" != "${mytree_local1}" ]] ; then
27910898Sroland.mainz@nrubsig.org		err_exit "compound trees 'mytree_global1' and 'mytree_local1' not identical"
2808462SApril.Chin@Sun.COM	fi
2818462SApril.Chin@Sun.COM
2828462SApril.Chin@Sun.COM	if [[ "${mytree_global1}" != "${mytree_global2}" ]] ; then
28310898Sroland.mainz@nrubsig.org		err_exit "compound trees 'mytree_global1' and 'mytree_global2' not identical"
2848462SApril.Chin@Sun.COM	fi
2858462SApril.Chin@Sun.COM
2868462SApril.Chin@Sun.COM	if [[ "${mytree_local1}" != "${mytree_local2}" ]] ; then
28710898Sroland.mainz@nrubsig.org		err_exit "compound trees 'mytree_local1' and 'mytree_local2' not identical"
2888462SApril.Chin@Sun.COM	fi
2898462SApril.Chin@Sun.COM
2908462SApril.Chin@Sun.COM
2918462SApril.Chin@Sun.COM	#### test "unset" in a subshell
2928462SApril.Chin@Sun.COM	(  unset 'mytree_global1.l1[urw].l2[itc zapfdingbats]'  ) || \
29310898Sroland.mainz@nrubsig.org		err_exit "try 1: variable 'mytree_global1.l1[urw].l2[itc zapfdingbats]' not found"
2948462SApril.Chin@Sun.COM	(  unset 'mytree_global1.l1[urw].l2[itc zapfdingbats]'  ) || \
29510898Sroland.mainz@nrubsig.org		err_exit "try 2: variable 'mytree_global1.l1[urw].l2[itc zapfdingbats]' not found"
2968462SApril.Chin@Sun.COM
2978462SApril.Chin@Sun.COM	# remove parent node (array element) and then check whether the child is gone, too:
2988462SApril.Chin@Sun.COM	(
2998462SApril.Chin@Sun.COM		unset 'mytree_global1.l1[urw].l2[itc zapfdingbats]'
30010898Sroland.mainz@nrubsig.org		[[ -v 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]'} ]]
30110898Sroland.mainz@nrubsig.org	) && err_exit "global: parent node removed (array element), child still exists"
3028462SApril.Chin@Sun.COM	(
3038462SApril.Chin@Sun.COM		unset 'mytree_local1.l1[urw].l2[itc zapfdingbats]'
30410898Sroland.mainz@nrubsig.org		[[ -v 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]]
30510898Sroland.mainz@nrubsig.org	) && err_exit "local: parent node removed (array element), child still exists"
30610898Sroland.mainz@nrubsig.org
3078462SApril.Chin@Sun.COM	# remove parent node  (array variable) and then check whether the child is gone, too:
3088462SApril.Chin@Sun.COM	(
3098462SApril.Chin@Sun.COM		unset 'mytree_local1.l1[urw].l2'
31010898Sroland.mainz@nrubsig.org		[[ -v 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]]
31110898Sroland.mainz@nrubsig.org	) && err_exit "global: parent node removed (array variable), child still exists"
3128462SApril.Chin@Sun.COM	(
3138462SApril.Chin@Sun.COM		unset 'mytree_local1.l1[urw].l2'
31410898Sroland.mainz@nrubsig.org		[[ -v 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]]
31510898Sroland.mainz@nrubsig.org	) && err_exit "local: parent node removed (array variable), child still exists"
3168462SApril.Chin@Sun.COM
3178462SApril.Chin@Sun.COM
3188462SApril.Chin@Sun.COM	#### test "unset" and compare trees
3198462SApril.Chin@Sun.COM	unset 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ||
32010898Sroland.mainz@nrubsig.org		err_exit "variable 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' not found"
32110898Sroland.mainz@nrubsig.org
3228462SApril.Chin@Sun.COM	[[ "${mytree_global1}" != "${mytree_local1}" ]] || err_exit "mytree_global1 and mytree_local1 should differ"
3238462SApril.Chin@Sun.COM
3248462SApril.Chin@Sun.COM	unset 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ||
32510898Sroland.mainz@nrubsig.org		err_exit "variable 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' not found"
32610898Sroland.mainz@nrubsig.org
3278462SApril.Chin@Sun.COM	# Compare trees (after "unset")
3288462SApril.Chin@Sun.COM	if [[ "${mytree_global1}" != "${mytree_local1}" ]] ; then
32910898Sroland.mainz@nrubsig.org		err_exit "compound trees 'mytree_local1' and 'mytree_global1' not identical after unset"
33010898Sroland.mainz@nrubsig.org	fi
3318462SApril.Chin@Sun.COM}
3328462SApril.Chin@Sun.COM
3338462SApril.Chin@Sun.COMmain
3348462SApril.Chin@Sun.COMexit $((Errors))
335