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