[prev in list] [next in list] [prev in thread] [next in thread]
List: busybox
Subject: Re: Bash shell support?
From: Juergen Hennerich <juergen () hennerich ! eu>
Date: 2006-08-30 22:35:51
Message-ID: 44F612C7.8060904 () hennerich ! eu
[Download RAW message or body]
Juergen Hennerich schrieb:
> I've attached an example of an array hack/implementation for ash.
>
Oops, I forgot to actually attach the files.
Juergen
["bash_array_test.sh" (application/x-shellscript)]
#!/bin/bash
indirect_reference () { eval echo \$$1; }
for ((j=1;j<=10;j++)) ; do echo creating func_$j : "func_$j () { echo \"This is \
function #$j\"; }" ; eval "func_$j () { echo \"This is function #$j\"; }" ; done
echo
echo "Creating array1 with 10 elements. The elements are func_1 to func_10. There are \
holes between the elements" echo
unset array1
echo
echo "Copying the elements from array1 into array2 in random order"
echo
for((i=1;i<=10;i++)); do array1[$((2*i))]=func_$i ; done #putting function names in \
array1
array_size=${#array1[@]} #it looks like there is a bug in my BASH. It only works with \
the temp. var. for ((i=1;i<=$array_size;i++))
do
eval index=$(echo \(${!array1[@]}\)) #producing an index for array1
x=$(($RANDOM % ${#array1[@]})) #producing a random number between 0 and \
#elements array1
array2[$i]=${array1[${index[$x]}]}; # copying element x from the remaining \
array1 to element i in array2 unset array1[${index[$x]}]}; #removing the copied \
element from array1 done
echo
echo "Executing the functions in array2"
echo
for h in ${array2[@]} ; do eval $(echo $h) ; done
["ash_array_test.sh" (application/x-shellscript)]
indirect_reference () { eval echo \$$1; }
number_of_array_elements () {
set -- $(echo $@)
echo $#
}
add_to_index() {
local index index_element indexname index_new
indexname="$1"
index_element="$2"
eval index=$(echo \$$indexname)
set -- $(echo $index)
while [ $# -ge 1 ] ; do
if [ $1 -ge $index_element ] ; then
if [ $1 -eq $index_element ] ; then
index_new="$index_new $index_element"
shift
index_new="$index_new $@"
unset index_element
break
else
index_new="$index_new $index_element $@"
unset index_element
break
fi
else
index_new="$index_new $1"
shift
fi
done
index_new="$index_new $index_element"
eval $indexname=\"$(echo $index_new)\"
}
remove_from_index() {
local index index_element indexname index_new
indexname="$1"
index_element="$2"
eval index=$(echo \$$indexname)
set -- $(echo $index)
while [ $# -ge 1 ] ; do
if [ $1 -eq $index_element ]
then
shift
index_new="$index_new $@"
break
else
index_new="$index_new $1"
shift
fi
done
eval $indexname=\"$(echo $index_new)\"
}
lookup_in_index () {
local array_name element
array_name=$1
element=$2
set -- $(echo $(eval echo \$${array_name}_idx))
eval echo \$$(($element + 1))
}
print_all_elements_in_array () {
local array_name elements
array_name=$1
for elements in $(eval echo \$${array_name}_idx)
do
echo -n "$( eval echo \$"${array_name}_$elements") "
done
}
destroy_array() {
local elements
array_name=$1
for elements in $(eval echo \$${array_name}_idx)
do
eval unset ${array_name}_$elements
done
eval unset ${array_name}_idx
}
create_array() {
eval "$1"_idx=\"\"
eval "$1"_we $(echo " () { eval add_to_index $1_idx \$1 ; eval ${1}_\${1}=\$2 ; \
}")
eval "$1"_re $(echo " () { eval echo '$'${1}_\$1 ; }")
eval "$1"_de $(echo " () { eval remove_from_index ${1}_idx \$1 ; eval unset $(echo \
${1}_\$1) ;}")
eval "$1"_ne $(echo " () { number_of_array_elements \$${1}_idx ;}")
eval "$1"_pi $(echo " () { echo \$${1}_idx ;}")
eval "$1"_li $(echo " () { lookup_in_index $1 \$1 ;}")
eval "$1"_pe $(echo " () { print_all_elements_in_array $1 ;}")
eval "$1"_destroy $(echo " () { destroy_array $1 ;}")
}
for j in `seq 1 10` ; do echo creating func_$j : "func_$j () { echo \"This is \
function #$j\"; }" ; eval "func_$j () { echo \"This is function #$j\"; }" ; done
create_array array1
create_array array2
for i in `seq 1 10` ; do array1_we $((2*$i)) func_$i ; done
echo
echo "Copying the elements from array1 into array2 in random order"
echo
# creating random numbers. This will break if the script runs more than once in a \
second. Warning: big fat hack random() { local number var ; var=${1:-rand}; \
number=$(eval echo \$$var) ; number=${number:-5} ; eval $(echo $var)=$(eval echo \
"$(awk "BEGIN { srand(systime() + $(eval echo $number)+1) ; print \
int(rand()*100000)%`echo \${2:-9999}` }")") ;}
for i in `seq 1 $(array1_ne)`
do
index="$(array1_pi)" #producing an index for array1
random rand $(array1_ne)
x=$rand #producing a random number between 0 and #elements array1
array2_we $i $(array1_re $(array1_li $x)) # copying element x from the remaining \
array1 to element i in array2 array1_de $(array1_li $x) #removing the copied element \
from array1 done
echo
echo "Executing the functions in array2"
echo
for h in $(array2_pe) ; do eval $(echo $h) ; done
array1_destroy
array2_destroy
_______________________________________________
busybox mailing list
busybox@busybox.net
http://busybox.net/cgi-bin/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic