Чтобы ответить на вопрос в заголовке, вы можете "сдвинуть" массив с помощью нотации подстроки/подмассива. Сам shift
работает только с позиционными параметрами.
$ a=(a b c d e)
$ a=("${a[@]:1}")
$ echo "${a[@]}"
b c d e
Аналогично, чтобы «вытолкнуть» последний элемент из массива:a=("${a[@]:0:${#a[@]} - 1}" )
илиunset "a[${#a[@]}-1]"
Так что, если бы вы хотели, вы могли бы сделать это:
a=(foo bar doo)
b=(123 456 789)
while [ "${#a[@]}" -gt 0 ]; do
echo "$a $b"
a=("${a[@]:1}")
b=("${b[@]:1}")
done
Но это портит массивы, а "сдвигающие" присваивания, вероятно, излишне копируют данные, так что обычная индексация может быть лучше .
a=(foo bar doo)
b=(123 456 789)
i=0
while [ "$i" -lt "${#a[@]}" ]; do
echo "${a[i]} ${b[i]}"
i=$((i+1))
done
Или, возможно, вместо этого используйте ассоциативный массив, если вас не волнует порядок элементов. "${!arr[@]}"
дает ключи в неопределенном порядке, возможно, не в том порядке, в котором они были назначены в:
declare -A arr=([foo]=123 [bar]=456 [doo]=789)
for k in "${!arr[@]}"; do
echo "$k ${arr[$k]}"
done