Para trocar as posições da matriz no lugar (mesmo com matrizes esparsas) (desde o bash 3.0):
#!/bin/bash
# Declare an sparse array to test:
array=([5]=1 [6]=2 [10]=3 [11]=4 [20]=5 [21]=6 [40]=7)
declare -p array
scan=("${!array[@]}") # non-sparse array of indexes.
min=0; max=$(( ${#scan[@]} - 1 )) # for all (indexed) elements.
while [[ min -lt max ]]
do
x="${array[scan[min]]}" # temp variable
array[scan[min]]="${array[scan[max]]}" # Exchange first and last
array[scan[max]]="$x" #
(( min++, max-- )) # Move closer
done
declare -p array
echo "Final Array swapped in-place"
echo "${array[@]}"
Em execução:
./script
declare -a array=([5]="1" [6]="2" [10]="3" [11]="4" [20]="5" [21]="6" [40]="7")
declare -a array=([5]="7" [6]="6" [10]="5" [11]="4" [20]="3" [21]="2" [40]="1")
Final Array swapped in place
7 6 5 4 3 2 1
Para o bash antigo, você precisa usar um loop (no bash (desde 2.04)) e usar $a
para evitar o espaço à direita:
#!/bin/bash
array=(1 2 3 4 5 6 7)
last=${#array[@]}
a=""
for (( i=last-1 ; i>=0 ; i-- ));do
printf '%s%s ' "$a" "${array[i]}"
a=" "
done
echo
Para o bash desde 2.03:
#!/bin/bash
array=(1 2 3 4 5 6 7)
last=${#array[@]}
a="";i=0
while [[ last -ge $((i+=1)) ]]; do
printf '%s%s' "$a" "${array[ last-i ]}"
a=" "
done
echo
Também (usando o operador negate) (desde o bash 4.2 +):
#!/bin/bash
array=(1 2 3 4 5 6 7)
last=${#array[@]}
a=""
for (( i=0 ; i<last ; i++ )); do
printf '%s%s' "$a" "${array[~i]}"
a=" "
done
echo