LINUX.ORG.RU

История изменений

Исправление vodz, (текущая версия) :

«Запись for f in ${!array[@]} статична, при удалении [элементов] будет лишние циклы» — vodz.

Именно. Если перезаписывать в array только нужные элементы, то выходной цикл мы можем сделать по счётчику полученных элементов, а ${!array[@]} же даст в том числе незатёртые.

«Разреженные массивы ... придуманы не для баловства, а для специальных задач. Данный топик их не требует» — снова vodz.

Именно. Разреженные массивы тут не требуются. Это вы их сюда подогнали. Вот с себя и спрашивайте.

arr=(a b c d)
for ((j = i = 0, n=${#arr[@]}; i < n; i++)); do
        if [[ "${arr[i]#[bc]}" == "${arr[i]}" ]]; then
                arr[j++]=${arr[i]}
        else
                unset arr[$i]
        fi
done
#
for ((i = j; i < n; i++)); do
        unset arr[$i]
done
# OR:
#for ((i = j; i < j; i++)); do
#        USE arr[$i]
#done

Результат - последовательно заполненый массив с нужными элементами. В коментариях — альтернатива, удобно и практично.

Ну да, надо признаться, до подкручивания предела цикла for в теле цикла, я бы не додумался. Лол.
Никак нет. *Равные* 'b' или 'с'.

Ну да, а я и не знал. Лол.

Ну а что поделаешь, если зачем-то надо считывать все в память, а не обрабатывать построчно?

Причём тут считывать, если речь конкретно о конструкции for var in ${arr[ * ]}?

Исходная версия vodz, :

«Запись for f in ${!array[@]} статична, при удалении [элементов] будет лишние циклы» — vodz.

Именно. Если перезаписывать в array только нужные элементы, то выходной цикл мы можем сделать по счётчику полученных элементов, а ${!array[@]} же даст в том числе незатёртые.

«Разреженные массивы ... придуманы не для баловства, а для специальных задач. Данный топик их не требует» — снова vodz.

Именно. Разреженные массивы тут не требуются. Это вы их сюда подогнали. Вот с себя и спрашивайте.

arr=(a b c d)
for ((j = i = 0, n=${#arr[@]}; i < n; i++)); do
        if [[ "${arr[i]#[bc]}" == "${arr[i]}" ]]; then
                arr[j++]=${arr[i]}
        else
                unset arr[$i]
        fi
done
for ((i = j; i < n; i++)); do
        unset arr[$i]
done

Результат - последовательно заполненый массив с нужными элементами.

Ну да, надо признаться, до подкручивания предела цикла for в теле цикла, я бы не додумался. Лол.
Никак нет. *Равные* 'b' или 'с'.

Ну да, а я и не знал. Лол.

Ну а что поделаешь, если зачем-то надо считывать все в память, а не обрабатывать построчно?

Причём тут считывать, если речь конкретно о конструкции for var in ${arr[ * ]}?