function emit_table { nameref d=$1 typeset -i idx=0 echo "" emit_row th "" "${d[idx++][@]}" for (( ; idx<${#d[@]}; idx++ )); do emit_row td $idx "${d[idx][@]}" done echo "
" } function emit_row { typeset tag=$1; shift typeset row="" for elem; do row+=$(printf "<%s>%s" "$tag" "$elem" "${tag## *}") done row+="" echo "$row" } function addrow { nameref d=$1 typeset n=${#d[@]} typeset -i i for ((i=0; i<$2; i++)); do d[n][i]=$(( $RANDOM % 10000 )) done } n=3 typeset -a data data[0]=("X" "Y" "Z") for i in {1..4}; do addrow data $n done emit_table data