В bash можно не только писать условия и циклы, но и реализовать базовые структуры данных. Сегодня - очередь (FIFO) и стек (LIFO) - с помощью обычных массивов.
▪️ Стек (LIFO). Последним пришел - первым ушел.
stack=()
# push
stack+=("первый")
stack+=("второй")
# pop
last_index=$(( ${#stack[@]} - 1 ))
echo "POP: ${stack[$last_index]}"
unset 'stack[$last_index]'
После этого в стеке остается только "первый".
▪️ Очередь (FIFO). Первым пришел - первым ушел.
queue=()
# enqueue
queue+=("alpha")
queue+=("beta")
# dequeue
echo "DEQUEUE: ${queue[0]}"
queue=("${queue[@]:1}")
Мы просто “срезаем” массив начиная с элемента 1.
▪️ Пример: обработка задач в очереди
queue=("job1" "job2" "job3")
while [[ ${#queue[@]} -gt 0 ]]; do
task="${queue[0]}"
echo "Processing $task"
queue=("${queue[@]:1}")
done
▪️ Условно реальный стек
push() { stack+=("$1"); }
pop() { echo "${stack[-1]}"; unset 'stack[-1]'; }
peek() { echo "${stack[-1]}"; }
С bash версии 4+ можно использовать [-1] для получения последнего элемента.
🌟 Минусы:
📍 Нет указателей, только пересоздание массива;
📍 Производительность не сравнима с языками типа Python, но работает.
BashTex 📱 #bash #utils