Ваша команда seq
генерирует 100 миллионов чисел (не считая пары) и требует около 800 МБ памяти для хранения только списка цифр (вероятно, заниженной оценки; каждое число может храниться в отдельном выделении памяти, что может означать 8 байтов для указателя и 16 байтов для выделенного блока, что утроит оценку пространства хранения).
Вы можете значительно улучшить ситуацию, используя:
for millions in $(seq 0 99)
do
for smallstuff in $(seq -f "%6.0f" 0 999999)
do
val="$millions$smallstuff"
...
done
done
Это значительно уменьшает объем необходимой памяти; единственная проблема, которую нужно посмотреть, это то, что он проверяет 0, чего не было в вашем исходном коде.