zsh: история с курсором в начале строки

Чтобы ответить на вопрос в заголовке, вы можете "сдвинуть" массив с помощью нотации подстроки/подмассива. Сам 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
1
15.01.2020, 19:41
0 ответов

Теги

Похожие вопросы