18462SApril.Chin@Sun.COM# 28462SApril.Chin@Sun.COM# CDDL HEADER START 38462SApril.Chin@Sun.COM# 48462SApril.Chin@Sun.COM# The contents of this file are subject to the terms of the 58462SApril.Chin@Sun.COM# Common Development and Distribution License (the "License"). 68462SApril.Chin@Sun.COM# You may not use this file except in compliance with the License. 78462SApril.Chin@Sun.COM# 88462SApril.Chin@Sun.COM# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 98462SApril.Chin@Sun.COM# or http://www.opensolaris.org/os/licensing. 108462SApril.Chin@Sun.COM# See the License for the specific language governing permissions 118462SApril.Chin@Sun.COM# and limitations under the License. 128462SApril.Chin@Sun.COM# 138462SApril.Chin@Sun.COM# When distributing Covered Code, include this CDDL HEADER in each 148462SApril.Chin@Sun.COM# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 158462SApril.Chin@Sun.COM# If applicable, add the following below this CDDL HEADER, with the 168462SApril.Chin@Sun.COM# fields enclosed by brackets "[]" replaced with your own identifying 178462SApril.Chin@Sun.COM# information: Portions Copyright [yyyy] [name of copyright owner] 188462SApril.Chin@Sun.COM# 198462SApril.Chin@Sun.COM# CDDL HEADER END 208462SApril.Chin@Sun.COM# 218462SApril.Chin@Sun.COM 228462SApril.Chin@Sun.COM# 23*12068SRoger.Faulkner@Oracle.COM# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 248462SApril.Chin@Sun.COM# 258462SApril.Chin@Sun.COM 268462SApril.Chin@Sun.COM# 278462SApril.Chin@Sun.COM# variable tree test #002 288462SApril.Chin@Sun.COM# Propose of this test is whether ksh93 handles global variable trees 298462SApril.Chin@Sun.COM# and function-local variable trees the same way, including "nameref" 308462SApril.Chin@Sun.COM# and "unset" handling. 318462SApril.Chin@Sun.COM# 328462SApril.Chin@Sun.COM 3310898Sroland.mainz@nrubsig.org# test setup 348462SApril.Chin@Sun.COMfunction err_exit 358462SApril.Chin@Sun.COM{ 368462SApril.Chin@Sun.COM print -u2 -n "\t" 378462SApril.Chin@Sun.COM print -u2 -r ${Command}[$1]: "${@:2}" 38*12068SRoger.Faulkner@Oracle.COM (( Errors < 127 && Errors++ )) 398462SApril.Chin@Sun.COM} 408462SApril.Chin@Sun.COMalias err_exit='err_exit $LINENO' 418462SApril.Chin@Sun.COM 4210898Sroland.mainz@nrubsig.org# the test cannot use "nounset" 4310898Sroland.mainz@nrubsig.orgCommand=${0##*/} 448462SApril.Chin@Sun.COMinteger Errors=0 458462SApril.Chin@Sun.COM 468462SApril.Chin@Sun.COM# "built_tree1" and "built_tree2" are identical except the way how they test 478462SApril.Chin@Sun.COM# whether a variable exists: 488462SApril.Chin@Sun.COM# - "built_tree1" uses "${varname}" != "", e.g. looking whether the variable 498462SApril.Chin@Sun.COM# as non-zero length content 5010898Sroland.mainz@nrubsig.org# - "built_tree2" uses "! ([[ -v varname ]] ; res=$? ; unset varname ; exit $res)", e.g. "unset" in a subshell. 518462SApril.Chin@Sun.COMfunction build_tree1 528462SApril.Chin@Sun.COM{ 538462SApril.Chin@Sun.COM#set -o errexit -o xtrace 548462SApril.Chin@Sun.COM typeset index 558462SApril.Chin@Sun.COM typeset s 568462SApril.Chin@Sun.COM typeset i 578462SApril.Chin@Sun.COM typeset dummy 588462SApril.Chin@Sun.COM typeset a b c d e f 598462SApril.Chin@Sun.COM 608462SApril.Chin@Sun.COM nameref dest_tree="$1" # destination tree 618462SApril.Chin@Sun.COM nameref srcdata="$2" # source data 628462SApril.Chin@Sun.COM typeset tree_mode="$3" # mode to define the type of leads 638462SApril.Chin@Sun.COM 648462SApril.Chin@Sun.COM typeset -A dest_tree.l1 658462SApril.Chin@Sun.COM 668462SApril.Chin@Sun.COM for index in "${!srcdata.hashnodes[@]}" ; do 678462SApril.Chin@Sun.COM nameref node=srcdata.hashnodes["${index}"] 688462SApril.Chin@Sun.COM 698462SApril.Chin@Sun.COM for i in "${node.xlfd[@]}" ; do 708462SApril.Chin@Sun.COM IFS='-' read dummy a b c d e f <<<"$i" 718462SApril.Chin@Sun.COM 728462SApril.Chin@Sun.COM if [[ "$a" == "" ]] ; then 738462SApril.Chin@Sun.COM a="$dummy" 748462SApril.Chin@Sun.COM fi 758462SApril.Chin@Sun.COM 768462SApril.Chin@Sun.COM [[ "$a" == "" ]] && a='-' 778462SApril.Chin@Sun.COM [[ "$b" == "" ]] && b='-' 788462SApril.Chin@Sun.COM [[ "$c" == "" ]] && c='-' 798462SApril.Chin@Sun.COM 808462SApril.Chin@Sun.COM if [[ "${dest_tree.l1["$a"]}" == "" ]] ; then 818462SApril.Chin@Sun.COM #if ! (unset dest_tree.l1["$a"]) ; then 828462SApril.Chin@Sun.COM typeset -A dest_tree.l1["$a"].l2 838462SApril.Chin@Sun.COM fi 848462SApril.Chin@Sun.COM 858462SApril.Chin@Sun.COM if [[ "${dest_tree.l1["$a"].l2["$b"]}" == "" ]] ; then 868462SApril.Chin@Sun.COM #if ! (unset dest_tree.l1["$a"].l2["$b"]) ; then 878462SApril.Chin@Sun.COM typeset -A dest_tree.l1["$a"].l2["$b"].l3 888462SApril.Chin@Sun.COM fi 898462SApril.Chin@Sun.COM 908462SApril.Chin@Sun.COM if [[ "${!dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[*]}" == "" ]] ; then 918462SApril.Chin@Sun.COM typeset -A dest_tree.l1["$a"].l2["$b"].l3["$c"].entries 928462SApril.Chin@Sun.COM fi 938462SApril.Chin@Sun.COM 948462SApril.Chin@Sun.COM typeset new_index 958462SApril.Chin@Sun.COM if [[ "${tree_mode}" == "leaf_name" ]] ; then 968462SApril.Chin@Sun.COM new_index=$(( ${#dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[@]}+1 )) 978462SApril.Chin@Sun.COM else 988462SApril.Chin@Sun.COM new_index="${node.name}" 998462SApril.Chin@Sun.COM 1008462SApril.Chin@Sun.COM # skip if the leaf node already exists 1018462SApril.Chin@Sun.COM if [[ "${dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}]}" != "" ]] ; then 1028462SApril.Chin@Sun.COM continue 1038462SApril.Chin@Sun.COM fi 1048462SApril.Chin@Sun.COM fi 1058462SApril.Chin@Sun.COM 1068462SApril.Chin@Sun.COM add_tree_leaf dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}] "${index}" "${tree_mode}" 1078462SApril.Chin@Sun.COM done 1088462SApril.Chin@Sun.COM done 1098462SApril.Chin@Sun.COM 1108462SApril.Chin@Sun.COM return 0 1118462SApril.Chin@Sun.COM} 1128462SApril.Chin@Sun.COM 1138462SApril.Chin@Sun.COM# "built_tree1" and "built_tree2" are identical except the way how they test 1148462SApril.Chin@Sun.COM# whether a variable exists: 1158462SApril.Chin@Sun.COM# - "built_tree1" uses "${varname}" != "", e.g. looking whether the variable 1168462SApril.Chin@Sun.COM# as non-zero length content 11710898Sroland.mainz@nrubsig.org# - "built_tree2" uses "! ([[ -v varname ]] ; res=$? ; unset varname ; exit $res)", e.g. "unset" in a subshell. 1188462SApril.Chin@Sun.COMfunction build_tree2 1198462SApril.Chin@Sun.COM{ 1208462SApril.Chin@Sun.COM#set -o errexit -o xtrace 1218462SApril.Chin@Sun.COM typeset index 1228462SApril.Chin@Sun.COM typeset s 1238462SApril.Chin@Sun.COM typeset i 1248462SApril.Chin@Sun.COM typeset dummy 1258462SApril.Chin@Sun.COM typeset a b c d e f 1268462SApril.Chin@Sun.COM 1278462SApril.Chin@Sun.COM nameref dest_tree="$1" # destination tree 1288462SApril.Chin@Sun.COM nameref srcdata="$2" # source data 1298462SApril.Chin@Sun.COM typeset tree_mode="$3" # mode to define the type of leads 1308462SApril.Chin@Sun.COM 1318462SApril.Chin@Sun.COM typeset -A dest_tree.l1 1328462SApril.Chin@Sun.COM 1338462SApril.Chin@Sun.COM for index in "${!srcdata.hashnodes[@]}" ; do 1348462SApril.Chin@Sun.COM nameref node=srcdata.hashnodes["${index}"] 1358462SApril.Chin@Sun.COM 1368462SApril.Chin@Sun.COM for i in "${node.xlfd[@]}" ; do 1378462SApril.Chin@Sun.COM IFS='-' read dummy a b c d e f <<<"$i" 1388462SApril.Chin@Sun.COM 1398462SApril.Chin@Sun.COM if [[ "$a" == "" ]] ; then 1408462SApril.Chin@Sun.COM a="$dummy" 1418462SApril.Chin@Sun.COM fi 1428462SApril.Chin@Sun.COM 1438462SApril.Chin@Sun.COM [[ "$a" == "" ]] && a='-' 1448462SApril.Chin@Sun.COM [[ "$b" == "" ]] && b='-' 1458462SApril.Chin@Sun.COM [[ "$c" == "" ]] && c='-' 1468462SApril.Chin@Sun.COM 1478462SApril.Chin@Sun.COM #if [[ "${dest_tree.l1["$a"]}" == "" ]] ; then 14810898Sroland.mainz@nrubsig.org if ! ([[ -v dest_tree.l1["$a"] ]] ; res=$? ; unset dest_tree.l1["$a"] ; exit $res) ; then 1498462SApril.Chin@Sun.COM typeset -A dest_tree.l1["$a"].l2 1508462SApril.Chin@Sun.COM fi 1518462SApril.Chin@Sun.COM 1528462SApril.Chin@Sun.COM #if [[ "${dest_tree.l1["$a"].l2["$b"]}" == "" ]] ; then 15310898Sroland.mainz@nrubsig.org if ! ([[ -v dest_tree.l1["$a"].l2["$b"] ]] ; res=$? ; unset dest_tree.l1["$a"].l2["$b"] ; exit $res) ; then 1548462SApril.Chin@Sun.COM typeset -A dest_tree.l1["$a"].l2["$b"].l3 1558462SApril.Chin@Sun.COM fi 1568462SApril.Chin@Sun.COM 1578462SApril.Chin@Sun.COM if [[ "${!dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[*]}" == "" ]] ; then 1588462SApril.Chin@Sun.COM typeset -A dest_tree.l1["$a"].l2["$b"].l3["$c"].entries 1598462SApril.Chin@Sun.COM fi 1608462SApril.Chin@Sun.COM 1618462SApril.Chin@Sun.COM typeset new_index 1628462SApril.Chin@Sun.COM if [[ "${tree_mode}" == "leaf_name" ]] ; then 1638462SApril.Chin@Sun.COM new_index=$(( ${#dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[@]}+1 )) 1648462SApril.Chin@Sun.COM else 1658462SApril.Chin@Sun.COM new_index="${node.name}" 1668462SApril.Chin@Sun.COM 1678462SApril.Chin@Sun.COM # skip if the leaf node already exists 1688462SApril.Chin@Sun.COM if [[ "${dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}]}" != "" ]] ; then 1698462SApril.Chin@Sun.COM continue 1708462SApril.Chin@Sun.COM fi 1718462SApril.Chin@Sun.COM fi 1728462SApril.Chin@Sun.COM 1738462SApril.Chin@Sun.COM add_tree_leaf dest_tree.l1["$a"].l2["$b"].l3["$c"].entries[${new_index}] "${index}" "${tree_mode}" 1748462SApril.Chin@Sun.COM done 1758462SApril.Chin@Sun.COM done 1768462SApril.Chin@Sun.COM 1778462SApril.Chin@Sun.COM return 0 1788462SApril.Chin@Sun.COM} 1798462SApril.Chin@Sun.COM 1808462SApril.Chin@Sun.COM 1818462SApril.Chin@Sun.COMfunction add_tree_leaf 1828462SApril.Chin@Sun.COM{ 1838462SApril.Chin@Sun.COM nameref tree_leafnode="$1" 1848462SApril.Chin@Sun.COM nameref data_node=srcdata.hashnodes["$2"] 1858462SApril.Chin@Sun.COM typeset add_mode="$3" 1868462SApril.Chin@Sun.COM 1878462SApril.Chin@Sun.COM case "${add_mode}" in 1888462SApril.Chin@Sun.COM "leaf_name") 1898462SApril.Chin@Sun.COM tree_leafnode="${data_node.name}" 1908462SApril.Chin@Sun.COM return 0 1918462SApril.Chin@Sun.COM ;; 1928462SApril.Chin@Sun.COM "leaf_compound") 1938462SApril.Chin@Sun.COM tree_leafnode=( 1948462SApril.Chin@Sun.COM typeset name="${data_node.name}" 1958462SApril.Chin@Sun.COM typeset -a filenames=( "${data_node.filenames[@]}" ) 1968462SApril.Chin@Sun.COM typeset -a comments=( "${data_node.comments[@]}" ) 1978462SApril.Chin@Sun.COM typeset -a xlfd=( "${data_node.xlfd[@]}" ) 1988462SApril.Chin@Sun.COM ) 1998462SApril.Chin@Sun.COM return 0 2008462SApril.Chin@Sun.COM ;; 2018462SApril.Chin@Sun.COM *) 2028462SApril.Chin@Sun.COM print -u2 -f "ERROR: Unknown mode %s in add_tree_leaf\n" "${add_mode}" 2038462SApril.Chin@Sun.COM return 1 2048462SApril.Chin@Sun.COM ;; 2058462SApril.Chin@Sun.COM esac 2068462SApril.Chin@Sun.COM 2078462SApril.Chin@Sun.COM # not reached 2088462SApril.Chin@Sun.COM return 1 2098462SApril.Chin@Sun.COM} 2108462SApril.Chin@Sun.COM 2118462SApril.Chin@Sun.COM# "mysrcdata_local" and "mysrcdata_global" must be identical 2128462SApril.Chin@Sun.COMtypeset mysrcdata_global=( 2138462SApril.Chin@Sun.COM typeset -A hashnodes=( 2148462SApril.Chin@Sun.COM [abcd]=( 2158462SApril.Chin@Sun.COM name='abcd' 2168462SApril.Chin@Sun.COM typeset -a xlfd=( 2178462SApril.Chin@Sun.COM '-urw-itc zapfchancery-medium-i-normal--0-0-0-0-p-0-iso8859-1' 2188462SApril.Chin@Sun.COM '-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-adobe-fontspecific' 2198462SApril.Chin@Sun.COM '-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-sun-fontspecific' 2208462SApril.Chin@Sun.COM ) 2218462SApril.Chin@Sun.COM typeset -a comments=( 2228462SApril.Chin@Sun.COM 'comment 1' 2238462SApril.Chin@Sun.COM 'comment 2' 2248462SApril.Chin@Sun.COM 'comment 3' 2258462SApril.Chin@Sun.COM ) 2268462SApril.Chin@Sun.COM typeset -a filenames=( 2278462SApril.Chin@Sun.COM '/home/foo/abcd_1' 2288462SApril.Chin@Sun.COM '/home/foo/abcd_2' 2298462SApril.Chin@Sun.COM '/home/foo/abcd_3' 2308462SApril.Chin@Sun.COM ) 2318462SApril.Chin@Sun.COM ) 2328462SApril.Chin@Sun.COM ) 2338462SApril.Chin@Sun.COM) 2348462SApril.Chin@Sun.COM 2358462SApril.Chin@Sun.COMmytree_global1=() 2368462SApril.Chin@Sun.COMmytree_global2=() 2378462SApril.Chin@Sun.COM 2388462SApril.Chin@Sun.COMfunction main 2398462SApril.Chin@Sun.COM{ 2408462SApril.Chin@Sun.COM # "mysrcdata_local" and "mysrcdata_global" must be identical 2418462SApril.Chin@Sun.COM typeset mysrcdata_local=( 2428462SApril.Chin@Sun.COM typeset -A hashnodes=( 2438462SApril.Chin@Sun.COM [abcd]=( 2448462SApril.Chin@Sun.COM name='abcd' 2458462SApril.Chin@Sun.COM typeset -a xlfd=( 2468462SApril.Chin@Sun.COM '-urw-itc zapfchancery-medium-i-normal--0-0-0-0-p-0-iso8859-1' 2478462SApril.Chin@Sun.COM '-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-adobe-fontspecific' 2488462SApril.Chin@Sun.COM '-urw-itc zapfdingbats-medium-r-normal--0-0-0-0-p-0-sun-fontspecific' 2498462SApril.Chin@Sun.COM ) 2508462SApril.Chin@Sun.COM typeset -a comments=( 2518462SApril.Chin@Sun.COM 'comment 1' 2528462SApril.Chin@Sun.COM 'comment 2' 2538462SApril.Chin@Sun.COM 'comment 3' 2548462SApril.Chin@Sun.COM ) 2558462SApril.Chin@Sun.COM typeset -a filenames=( 2568462SApril.Chin@Sun.COM '/home/foo/abcd_1' 2578462SApril.Chin@Sun.COM '/home/foo/abcd_2' 2588462SApril.Chin@Sun.COM '/home/foo/abcd_3' 2598462SApril.Chin@Sun.COM ) 2608462SApril.Chin@Sun.COM ) 2618462SApril.Chin@Sun.COM ) 2628462SApril.Chin@Sun.COM ) 2638462SApril.Chin@Sun.COM 2648462SApril.Chin@Sun.COM #### Build tree using global tree variables 2658462SApril.Chin@Sun.COM build_tree1 mytree_global1 mysrcdata_global leaf_compound || \ 2668462SApril.Chin@Sun.COM err_exit 'build_tree1 mytree_global1 mysrcdata_global leaf_compound returned an error' 2678462SApril.Chin@Sun.COM (( $(print -r -- "${mytree_global1}" | wc -l) > 10 )) || err_exit "Compound tree 'mytree_global1' too small." 2688462SApril.Chin@Sun.COM 2698462SApril.Chin@Sun.COM build_tree2 mytree_global2 mysrcdata_global leaf_compound || \ 2708462SApril.Chin@Sun.COM err_exit 'build_tree2 mytree_global2 mysrcdata_global leaf_compound returned an error' 2718462SApril.Chin@Sun.COM (( $(print -r -- "${mytree_global2}" | wc -l) > 10 )) || err_exit "Compound tree 'mytree_global2' too small." 2728462SApril.Chin@Sun.COM 2738462SApril.Chin@Sun.COM 2748462SApril.Chin@Sun.COM #### build tree using local tree variables 2758462SApril.Chin@Sun.COM mytree_local1=() 2768462SApril.Chin@Sun.COM mytree_local2=() 2778462SApril.Chin@Sun.COM 2788462SApril.Chin@Sun.COM build_tree1 mytree_local1 mysrcdata_local leaf_compound || \ 2798462SApril.Chin@Sun.COM err_exit 'build_tree1 mytree_local1 mysrcdata_local leaf_compound returned an error' 2808462SApril.Chin@Sun.COM (( $(print -r -- "${mytree_local1}" | wc -l) > 10 )) || err_exit "Compound tree 'mytree_local1' too small." 2818462SApril.Chin@Sun.COM 2828462SApril.Chin@Sun.COM build_tree2 mytree_local2 mysrcdata_local leaf_compound || \ 2838462SApril.Chin@Sun.COM err_exit 'build_tree2 mytree_local2 mysrcdata_local leaf_compound returned an error' 2848462SApril.Chin@Sun.COM (( $(print -r -- "${mytree_local2}" | wc -l) > 10 )) || err_exit "Compound tree 'mytree_local2' too small." 2858462SApril.Chin@Sun.COM 2868462SApril.Chin@Sun.COM 2878462SApril.Chin@Sun.COM #### Compare treess 2888462SApril.Chin@Sun.COM if [[ "${mytree_global1}" != "${mytree_local1}" ]] ; then 2898462SApril.Chin@Sun.COM err_exit "Compound trees 'mytree_global1' and 'mytree_local1' not identical" 2908462SApril.Chin@Sun.COM diff -u <( printf "%s\n" "${mytree_global1}" ) <( printf "%s\n" "${mytree_local1}" ) 2918462SApril.Chin@Sun.COM fi 2928462SApril.Chin@Sun.COM 2938462SApril.Chin@Sun.COM if [[ "${mytree_global1}" != "${mytree_global2}" ]] ; then 2948462SApril.Chin@Sun.COM err_exit "Compound trees 'mytree_global1' and 'mytree_global2' not identical" 2958462SApril.Chin@Sun.COM diff -u <( printf "%s\n" "${mytree_global1}" ) <( printf "%s\n" "${mytree_global2}" ) 2968462SApril.Chin@Sun.COM fi 2978462SApril.Chin@Sun.COM 2988462SApril.Chin@Sun.COM if [[ "${mytree_local1}" != "${mytree_local2}" ]] ; then 2998462SApril.Chin@Sun.COM err_exit "Compound trees 'mytree_local1' and 'mytree_local2' not identical" 3008462SApril.Chin@Sun.COM diff -u <( printf "%s\n" "${mytree_local1}" ) <( printf "%s\n" "${mytree_local2}" ) 3018462SApril.Chin@Sun.COM fi 3028462SApril.Chin@Sun.COM 3038462SApril.Chin@Sun.COM 3048462SApril.Chin@Sun.COM #### test "unset" in a subshell 30510898Sroland.mainz@nrubsig.org ( [[ -v 'mytree_global1.l1[urw].l2[itc zapfdingbats]' ]] ; res=$? ; unset 'mytree_global1.l1[urw].l2[itc zapfdingbats]' ; exit $res ) || \ 3068462SApril.Chin@Sun.COM err_exit "Try 1: Variable 'mytree_global1.l1[urw].l2[itc zapfdingbats]' not found." 30710898Sroland.mainz@nrubsig.org ( [[ -v 'mytree_global1.l1[urw].l2[itc zapfdingbats]' ]] ; res=$? ; unset 'mytree_global1.l1[urw].l2[itc zapfdingbats]' ; exit $res ) || \ 3088462SApril.Chin@Sun.COM err_exit "Try 2: Variable 'mytree_global1.l1[urw].l2[itc zapfdingbats]' not found." 3098462SApril.Chin@Sun.COM 3108462SApril.Chin@Sun.COM # remove parent node (array element) and then check whether the child is gone, too: 3118462SApril.Chin@Sun.COM ( 3128462SApril.Chin@Sun.COM set -o errexit 3138462SApril.Chin@Sun.COM unset 'mytree_global1.l1[urw].l2[itc zapfdingbats]' 31410898Sroland.mainz@nrubsig.org ! [[ -v 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]] 3158462SApril.Chin@Sun.COM ) || err_exit "Global: Parent node removed (array element), child still exists" 3168462SApril.Chin@Sun.COM ( 3178462SApril.Chin@Sun.COM set -o errexit 3188462SApril.Chin@Sun.COM unset 'mytree_local1.l1[urw].l2[itc zapfdingbats]' 31910898Sroland.mainz@nrubsig.org ! [[ -v 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]] 3208462SApril.Chin@Sun.COM ) || err_exit "Local: Parent node removed (array element), child still exists" 3218462SApril.Chin@Sun.COM 3228462SApril.Chin@Sun.COM # remove parent node (array variable) and then check whether the child is gone, too: 3238462SApril.Chin@Sun.COM ( 3248462SApril.Chin@Sun.COM set -o errexit 3258462SApril.Chin@Sun.COM unset 'mytree_local1.l1[urw].l2' 32610898Sroland.mainz@nrubsig.org ! [[ -v 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]] 3278462SApril.Chin@Sun.COM ) || err_exit "Global: Parent node removed (array variable), child still exists" 3288462SApril.Chin@Sun.COM ( 3298462SApril.Chin@Sun.COM set -o errexit 3308462SApril.Chin@Sun.COM unset 'mytree_local1.l1[urw].l2' 33110898Sroland.mainz@nrubsig.org ! [[ -v 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]] 3328462SApril.Chin@Sun.COM ) || err_exit "Local: Parent node removed (array variable), child still exists" 3338462SApril.Chin@Sun.COM 3348462SApril.Chin@Sun.COM 3358462SApril.Chin@Sun.COM #### test "unset" and compare trees 33610898Sroland.mainz@nrubsig.org [[ -v 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]] ; res=$? 33710898Sroland.mainz@nrubsig.org unset 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' 33810898Sroland.mainz@nrubsig.org (( res == 0 )) || 3398462SApril.Chin@Sun.COM err_exit "Variable 'mytree_global1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' not found." 3408462SApril.Chin@Sun.COM 3418462SApril.Chin@Sun.COM [[ "${mytree_global1}" != "${mytree_local1}" ]] || err_exit "mytree_global1 and mytree_local1 should differ" 3428462SApril.Chin@Sun.COM 34310898Sroland.mainz@nrubsig.org [[ -v 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' ]] ; res=$? 34410898Sroland.mainz@nrubsig.org unset 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' 34510898Sroland.mainz@nrubsig.org (( res == 0 )) || 3468462SApril.Chin@Sun.COM err_exit "Variable 'mytree_local1.l1[urw].l2[itc zapfdingbats].l3[medium].entries[abcd].filenames[0]' not found." 3478462SApril.Chin@Sun.COM 3488462SApril.Chin@Sun.COM # Compare trees (after "unset") 3498462SApril.Chin@Sun.COM if [[ "${mytree_global1}" != "${mytree_local1}" ]] ; then 3508462SApril.Chin@Sun.COM err_exit "Compound trees 'mytree_local1' and 'mytree_global1' not identical after unset" 3518462SApril.Chin@Sun.COM diff -u <( printf "%s\n" "${mytree_global1}" ) <( printf "%s\n" "${mytree_local1}" ) 3528462SApril.Chin@Sun.COM fi 3538462SApril.Chin@Sun.COM} 3548462SApril.Chin@Sun.COM 3558462SApril.Chin@Sun.COMmain 3568462SApril.Chin@Sun.COM 3578462SApril.Chin@Sun.COM# tests done 3588462SApril.Chin@Sun.COMexit $((Errors)) 359