280 lines
5.1 KiB
Text
280 lines
5.1 KiB
Text
# this is needed so that the bad assignments (b[]=bcde, for example) do not
|
|
# cause fatal shell errors when in posix mode
|
|
set +o posix
|
|
|
|
set +a
|
|
# The calls to egrep -v are to filter out builtin array variables that are
|
|
# automatically set and possibly contain values that vary.
|
|
|
|
# this should be an error
|
|
test=(first & second)
|
|
echo $?
|
|
unset test
|
|
|
|
# make sure declare -a converts an existing variable to an array
|
|
unset a
|
|
a=abcde
|
|
declare -a a
|
|
echo ${a[0]}
|
|
|
|
unset a
|
|
a=abcde
|
|
a[2]=bdef
|
|
|
|
declare -a b[256]
|
|
|
|
unset c[2]
|
|
unset c[*]
|
|
|
|
a[1]=
|
|
|
|
_ENV=/bin/true
|
|
x=${_ENV[(_$-=0)+(_=1)-_${-%%*i*}]}
|
|
|
|
declare -r c[100]
|
|
|
|
echo ${a[0]} ${a[4]}
|
|
echo ${a[@]}
|
|
|
|
echo ${a[*]}
|
|
|
|
# this should print out values, too
|
|
declare -a | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
|
|
|
|
unset a[7]
|
|
echo ${a[*]}
|
|
|
|
unset a[4]
|
|
echo ${a[*]}
|
|
|
|
echo ${a}
|
|
echo "${a}"
|
|
echo $a
|
|
|
|
unset a[0]
|
|
echo ${a}
|
|
|
|
echo ${a[@]}
|
|
|
|
a[5]="hello world"
|
|
echo ${a[5]}
|
|
echo ${#a[5]}
|
|
|
|
echo ${#a[@]}
|
|
|
|
a[4+5/2]="test expression"
|
|
echo ${a[@]}
|
|
|
|
readonly a[5]
|
|
readonly a
|
|
# these two lines should output `declare' commands
|
|
readonly -a | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
|
|
declare -ar | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
|
|
# this line should output `readonly' commands, even for arrays
|
|
set -o posix
|
|
readonly -a | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
|
|
set +o posix
|
|
|
|
declare -a d='([1]="" [2]="bdef" [5]="hello world" "test")'
|
|
d[9]="ninth element"
|
|
|
|
declare -a e[10]=test
|
|
declare -a e[10]='(test)'
|
|
|
|
pass=/etc/passwd
|
|
declare -a f='("${d[@]}")'
|
|
b=([0]=this [1]=is [2]=a [3]=test [4]="$PS1" [5]=$pass)
|
|
|
|
echo ${b[@]:2:3}
|
|
|
|
declare -pa | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
|
|
|
|
a[3]="this is a test"
|
|
|
|
b[]=bcde
|
|
b[*]=aaa
|
|
echo ${b[ ]}
|
|
|
|
c[-2]=4
|
|
echo ${c[-4]}
|
|
|
|
d[7]=(abdedfegeee)
|
|
|
|
d=([]=abcde [1]="test test" [*]=last [-65]=negative )
|
|
|
|
unset d[12]
|
|
unset e[*]
|
|
|
|
declare -a | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
|
|
|
|
ps1='hello'
|
|
unset ps1[2]
|
|
unset ${ps1[2]}
|
|
|
|
declare +a ps1
|
|
declare +a c
|
|
|
|
# the prompt should not print when using a here doc
|
|
read -p "array test: " -a rv <<!
|
|
this is a test of read using arrays
|
|
!
|
|
|
|
echo ${rv[0]} ${rv[4]}
|
|
echo ${rv[@]}
|
|
|
|
# the variable should be converted to an array when `read -a' is done
|
|
vv=1
|
|
read -a vv <<!
|
|
this is a test of arrays
|
|
!
|
|
echo ${vv[0]} ${vv[3]}
|
|
echo ${vv[@]}
|
|
unset vv
|
|
|
|
declare -a | egrep -v '(BASH_VERSINFO|PIPESTATUS|GROUPS)'
|
|
|
|
export rv
|
|
#set
|
|
|
|
x[4]=bbb
|
|
x=abde
|
|
echo $x
|
|
echo ${x[0]}
|
|
echo ${x[4]}
|
|
echo efgh | ( read x[1] ; echo ${x[1]} )
|
|
echo wxyz | ( declare -a x ; read x ; echo $x ; echo ${x[0]} )
|
|
|
|
# Make sure that arrays can be used to save the positional paramters verbatim
|
|
set -- a 'b c' d 'e f g' h
|
|
|
|
ARGV=( [0]=$0 "$@" )
|
|
|
|
for z in "${ARGV[@]}"
|
|
do
|
|
echo "$z"
|
|
done
|
|
|
|
echo "$0"
|
|
for z in "$@"
|
|
do
|
|
echo "$z"
|
|
done
|
|
|
|
# do various pattern removal and length tests
|
|
XPATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:.:/sbin:/usr/sbin
|
|
|
|
xpath=( $( IFS=: ; echo $XPATH ) )
|
|
|
|
echo ${xpath[@]}
|
|
echo ${xpath[@]##*/}
|
|
echo ${xpath[0]##*/}
|
|
echo ${xpath[@]%%[!/]*}
|
|
echo ${xpath[0]%%[!/]*}
|
|
|
|
# let's try to make it a DOS-style path
|
|
|
|
zecho "${xpath[@]/\//\\}"
|
|
zecho "${xpath[@]//\//\\}"
|
|
zecho "${xpath[@]//[\/]/\\}"
|
|
|
|
# length of the first element of the array, since array without subscript
|
|
# is equivalent to referencing first element
|
|
echo ${#xpath} -- ${#xpath[0]}
|
|
|
|
# number of elements in the array
|
|
nelem=${#xpath[@]}
|
|
echo ${#xpath[@]} -- $nelem
|
|
|
|
# total length of all elements in the array, including space separators
|
|
xx="${xpath[*]}"
|
|
echo ${#xx}
|
|
|
|
# total length of all elements in the array
|
|
xx=$( IFS='' ; echo "${xpath[*]}" )
|
|
echo ${#xx}
|
|
|
|
unset xpath[nelem-1]
|
|
|
|
nelem=${#xpath[@]}
|
|
echo ${#xpath[@]} -- $nelem
|
|
|
|
# arrays and things that look like index assignments
|
|
array=(42 [1]=14 [2]=44)
|
|
|
|
array2=(grep [ 123 ] \*)
|
|
|
|
echo ${array[@]}
|
|
echo "${array2[@]}"
|
|
|
|
# arrays and implicit arithmetic evaluation
|
|
declare -i -a iarray
|
|
|
|
iarray=( 2+4 1+6 7+2 )
|
|
echo ${iarray[@]}
|
|
|
|
iarray[4]=4+1
|
|
echo ${iarray[@]}
|
|
|
|
# make sure assignment using the compound assignment syntax removes all
|
|
# of the old elements from the array value
|
|
barray=(old1 old2 old3 old4 old5)
|
|
barray=(new1 new2 new3)
|
|
echo "length = ${#barray[@]}"
|
|
echo "value = ${barray[*]}"
|
|
|
|
# make sure the array code behaves correctly with respect to unset variables
|
|
set -u
|
|
( echo ${#narray[4]} )
|
|
|
|
# some old bugs and ksh93 compatibility tests
|
|
set +u
|
|
cd /tmp
|
|
|
|
touch 1=bar
|
|
foo=([10]="bar")
|
|
echo ${foo[0]}
|
|
rm 1=bar
|
|
|
|
foo=(a b c d e f g)
|
|
echo ${foo[@]}
|
|
|
|
# quoted reserved words are ok
|
|
foo=(\for \case \if \then \else)
|
|
echo ${foo[@]}
|
|
|
|
# quoted metacharacters are ok
|
|
foo=( [1]='<>' [2]='<' [3]='>' [4]='!' )
|
|
echo ${foo[@]}
|
|
|
|
# numbers are just words when not in a redirection context
|
|
foo=( 12 14 16 18 20 )
|
|
echo ${foo[@]}
|
|
|
|
foo=( 4414758999202 )
|
|
echo ${foo[@]}
|
|
|
|
# this was a bug in all versions of bash 2.x up to and including bash-2.04
|
|
declare -a ddd=(aaa
|
|
bbb)
|
|
echo ${ddd[@]}
|
|
|
|
# errors
|
|
foo=(a b c for case if then else)
|
|
|
|
foo=(for case if then else)
|
|
|
|
metas=( <> < > ! )
|
|
metas=( [1]=<> [2]=< [3]=> [4]=! )
|
|
|
|
# various expansions that didn't really work right until post-bash-2.04
|
|
foo='abc'
|
|
echo ${foo[0]} ${#foo[0]}
|
|
echo ${foo[1]} ${#foo[1]}
|
|
echo ${foo[@]} ${#foo[@]}
|
|
echo ${foo[*]} ${#foo[*]}
|
|
|
|
foo=''
|
|
echo ${foo[0]} ${#foo[0]}
|
|
echo ${foo[1]} ${#foo[1]}
|
|
echo ${foo[@]} ${#foo[@]}
|
|
echo ${foo[*]} ${#foo[*]}
|