Usando a expansão de subcadeia Bash (subarray) (por exemplo, ${parameter:offset:length}
) ...
array=(A B C D E F)
start=$1
# handle negative offsets
[[ $start -lt 0 ]] && start=$((${#array[@]} + start))
# the star of the show, create array2 from two sub-arrays of array
array2=("${array[@]:$start}" "${array[@]:0:$start}")
echo "${array2[@]}"
Aqui estamos colocando o array original em um array recém-ordenado apenas para ilustrar. (Eu omiti algumas verificações de limite óbvias e coisas do tipo.)
$ ./rotate.sh 3
D E F A B C
Atualização: modifiquei o script acima para lidar com as compensações negativas (inspiradas na resposta da ikkachu ) ...
$ ./rotate.sh -2
E F A B C D
Atualização 2: Para que o script aceite uma das letras "A" a "F", que está mais de acordo com o exemplo da pergunta, substitua start=$1
por:
# Convert [A-F] to ASCII code then normalize to [0-5]
LC_CTYPE=C start=$(( $(printf %d "'$1") - 65 ))
É claro que, se você não tiver uma matriz de letras bem ordenada, precisará de algo mais como isso, que manipulará elementos arbitrários de matriz:
idx=0
for elem in "${array[@]}"; do
[[ $elem = $1 ]] && break
((idx++))
done
start=$idx