Причина в том, что в то время как цикл выполняется в подоболочке из-за того, что он передан по конвейеру. Подоболочка использует копию родительской среды оболочки и не передает ее обратно при выходе из подоболочки.
для bash можно использовать обходной путь группировки команд, обратите внимание на добавленные фигурные скобки
ls -las | tail -n +4 | { while read line; do ring+=("$line"); echo ${ring[-1]}; done; echo ${ring[0]}; }
Согласно ответу @xenoid, у меня работает следующий код
echo -e "Hello.\n;132\$And; Another\$98?';:" | sed -e 's/\([[:alpha:]]\+\)\$\([[:digit:]]\+\)/\1 THIS \2/g' -e 's/[[:punct:]]//g' -e 's/ THIS /$/g' | tr '[:upper:]' '[:lower:]'
Результат:
hello
132and another$98