Bash has a neat way of giving all elements in an array except the first:
"${a[@]:1}"
To get all except the last I have found:
"${a[@]:0:$((${#a[@]}-1))}"
But, man, that is ugly.
Is there an elegant alternative?
I am not sure how much improvement it would be, but you can drop the arithmetic operator ($(())) and starting index (0 here):
${a[@]::${#a[@]}-1}
So:
$ foo=( 1 2 3 )
$ echo "${foo[@]::${#foo[@]}-1}"
1 2
As you can see, the improvement is purely syntactical; the idea remains the same.
b=("${a[@]}"); unset "b[-1]"; do_whatever_with "${b[@]}"