Function: roll

Rotate top N elements; [N] moves to [0] with optional repeat

USAGE: roll arrayname num:3 repeat:1

roll()
{     
  # 1 2 3 => 3 1 2      #: default=3
  # 1 2 3 4 => 4 1 2 3  #: 4 in $2
  local arrayname=${1:?Array name required} num=${2:-${roldef:-3}} repeat=${3:-1}
  local array tmp
  

Check that there are at least $num elements in the array

  eval "[ ${#arrayname[@]} -ge $num ] || return 1"
  

Copy the array, $arrayname, to local array

  eval "array=( \"\${$arrayname[@]}\" )"
  while [ $(( repeat -= 1 )) -ge 0 ]
  do
    tmp=${array[num-1]}
    unset array[num-1]
    array=( "$tmp" "${array[@]}" )
  done
  

Copy array back to $arrayname

  eval "$arrayname=( \"\${array[@]}\" )"
}