mirror of https://github.com/n-hys/bash.git
247 lines
4.8 KiB
Plaintext
247 lines
4.8 KiB
Plaintext
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
# TEST - basic declaration and assignment
|
|
typeset -A fluff
|
|
declare -A
|
|
|
|
fluff[foo]=one
|
|
fluff[bar]=two
|
|
|
|
declare -A
|
|
declare -p fluff
|
|
|
|
unset fluff[foo]
|
|
declare -p fluff
|
|
|
|
fluff[bar]=newval
|
|
declare fluff[qux]=assigned
|
|
|
|
declare -p fluff
|
|
|
|
unset fluff
|
|
|
|
# TEST - compound assignment and variable attributes
|
|
declare -A wheat chaff
|
|
wheat=( [zero]=0 [one]=a [two]=b [three]=c )
|
|
|
|
declare -i chaff
|
|
chaff=( [zero]=1+4 [one]=3+7 four )
|
|
|
|
declare -A waste=( [pid]=42134 [version]=4.0-devel [source]=$0 [lineno]=$LINENO )
|
|
declare -r waste
|
|
|
|
declare -A
|
|
|
|
declare +i chaff
|
|
chaff[hello world]=flip
|
|
declare -p chaff
|
|
|
|
# TEST - errors
|
|
waste[stuff]=other
|
|
unset waste
|
|
chaff[*]=12
|
|
chaff=( [one]=a [*]=12 )
|
|
|
|
# TEST - key expansion -- no word splitting
|
|
chaff[hello world]=flip
|
|
declare -p chaff
|
|
echo ${chaff[hello world]}
|
|
|
|
chaff[box]="multiple words"
|
|
|
|
recho ${chaff[@]}
|
|
recho "${chaff[@]}"
|
|
|
|
recho ${chaff[*]}
|
|
recho "${chaff[*]}"
|
|
|
|
unset chaff
|
|
declare -A chaff[200]
|
|
declare +A chaff
|
|
|
|
chaff[*]=12
|
|
chaff=( [one]=a [*]=12 )
|
|
|
|
# TEST - keys and values containing spaces
|
|
unset wheat
|
|
declare -A wheat
|
|
wheat=([six]=6 [foo bar]="qux qix" )
|
|
|
|
declare -p wheat
|
|
|
|
unset wheat
|
|
declare -A wheat=([six]=6 [foo bar]="qux qix" )
|
|
|
|
recho ${wheat[foo bar]}
|
|
recho "${wheat[foo bar]}"
|
|
|
|
declare -p wheat
|
|
|
|
# TEST - basic expansions: number of elements and value length
|
|
unset wheat
|
|
typeset -A wheat
|
|
wheat=([six]=6 [foo bar]="qux qix" )
|
|
|
|
recho ${#wheat[@]}
|
|
|
|
recho ${#wheat[foo bar]}
|
|
|
|
# TEST - appending assignment operator
|
|
unset wheat
|
|
typeset -A wheat
|
|
wheat=([six]=6 [foo bar]="qux qix" )
|
|
|
|
wheat[foo bar]+=' blat'
|
|
|
|
recho ${wheat[foo bar]}
|
|
recho "${wheat[foo bar]}"
|
|
unset wheat
|
|
|
|
flix=9
|
|
typeset -Ai wheat
|
|
wheat=([six]=6 [foo bar]=flix )
|
|
|
|
wheat[foo bar]+=7
|
|
|
|
recho ${wheat[foo bar]}
|
|
recho "${wheat[foo bar]}"
|
|
unset flix wheat
|
|
|
|
# TEST - index expansion: no word splitting or globbing
|
|
typeset -A wheat
|
|
cd ${TMPDIR:=/tmp}
|
|
touch '[sfiri]'
|
|
wheat=([s*]=6 [foo bar]=flix )
|
|
|
|
recho ${wheat[@]}
|
|
rm '[sfiri]'
|
|
cd $OLDPWD
|
|
|
|
# TEST -- associative array keys expansion
|
|
unset wheat
|
|
typeset -A wheat
|
|
|
|
wheat=([six]=6 [foo bar]=flix )
|
|
|
|
recho ${!wheat[@]}
|
|
recho "${!wheat[@]}"
|
|
|
|
# TEST -- associative array pattern removal
|
|
unset xpath
|
|
typeset -A xpath
|
|
|
|
xpath=( [0]=/bin [one]=/bin [two]=/usr/bin [three]=/usr/ucb [four]=/usr/local/bin)
|
|
xpath+=( [five]=/sbin [six]=/usr/sbin [seven]=. )
|
|
|
|
echo ${#xpath[@]}
|
|
|
|
echo ${xpath[@]}
|
|
echo ${xpath[@]##*/}
|
|
echo ${xpath[0]##*/}
|
|
echo ${xpath[@]%%[!/]*}
|
|
echo ${xpath[0]%%[!/]*}
|
|
recho ${xpath##*/}
|
|
recho ${xpath%%[!/]*}
|
|
recho ${xpath[five]##*/}
|
|
recho ${xpath[five]%%[!/]*}
|
|
|
|
echo ${#xpath[*]}
|
|
|
|
echo ${xpath[*]}
|
|
echo ${xpath[*]##*/}
|
|
echo ${xpath[*]%%[!/]*}
|
|
|
|
# TEST -- associative array pattern substitution
|
|
unset xpath
|
|
typeset -A xpath
|
|
|
|
xpath=( [0]=/bin [one]=/bin [two]=/usr/bin [three]=/usr/ucb [four]=/usr/local/bin)
|
|
xpath+=( [five]=/sbin [six]=/usr/sbin [seven]=. )
|
|
|
|
echo ${#xpath[@]}
|
|
# default element is "0" (as a string)
|
|
echo ${#xpath} -- ${xpath["0"]}
|
|
|
|
echo ${xpath[@]//\//^}
|
|
echo "${xpath[@]//\//^}" | cat -v
|
|
|
|
zecho "${xpath[@]/\//\\}"
|
|
zecho "${xpath[@]//\//\\}"
|
|
zecho "${xpath[@]//[\/]/\\}"
|
|
|
|
# test assignment to key "0"
|
|
unset T
|
|
declare -A T
|
|
T='([a]=1)'
|
|
echo "${T[@]}"
|
|
unset T
|
|
|
|
# peculiar ksh93 semantics for unsubscripted assoc variable reference
|
|
declare -A T
|
|
T[0]='zero'
|
|
if [ "$T" != "${T[0]}" ]; then
|
|
echo 'assoc.tests: $T and ${T[0]} mismatch'
|
|
fi
|
|
|
|
${THIS_SH} ./assoc1.sub
|
|
|
|
${THIS_SH} ./assoc2.sub
|
|
|
|
${THIS_SH} ./assoc3.sub
|
|
|
|
${THIS_SH} ./assoc4.sub
|
|
|
|
${THIS_SH} ./assoc5.sub
|
|
|
|
${THIS_SH} ./assoc6.sub
|
|
|
|
${THIS_SH} ./assoc7.sub
|
|
|
|
# test converting between scalars and assoc arrays
|
|
unset assoc
|
|
assoc=assoc
|
|
declare -A assoc
|
|
declare -p assoc
|
|
echo ${assoc[@]}
|
|
|
|
# weird syntax required to append to multiple existing array elements using
|
|
# compound assignment syntax
|
|
unset assoc
|
|
declare -A assoc
|
|
assoc=( [one]=one [two]=two [three]=three )
|
|
assoc+=( [one]+=more [two]+=less )
|
|
declare -p assoc
|
|
|
|
readonly -A assoc
|
|
declare -p assoc
|
|
|
|
declare -A hash
|
|
|
|
hash=(["key"]="value1")
|
|
declare -p hash
|
|
hash=(["key"]="${hash["key"]} value2")
|
|
declare -p hash
|
|
|
|
unset hash
|
|
|
|
${THIS_SH} ./assoc8.sub
|
|
|
|
# new shopt option to prevent multiple expansion of assoc array subscripts
|
|
${THIS_SH} ./assoc9.sub
|
|
|
|
${THIS_SH} ./assoc10.sub
|
|
|
|
# test assigning associative arrays using compound key/value pair assignments
|
|
${THIS_SH} ./assoc11.sub
|