[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