Это должно работать во всех POSIX оболочек:
i=0; while :; do echo "$((i+=1))"; done
:
взаимозаменяем с true
встроенных команд (которые вы можете использовать вместо): это не-оп, который всегда удается (= возвращает 0) ,
Если целочисленное переполнение беспокоит вас, и вы хотите произвольной точности с помощью стандартных инструментов:
nocontinuation(){ sed ':x; /\\$/ { N; s/\\\n//; tx }'; }
i=99999999999999999999999999999999999999999999999999999999999999999999;
while : ; do i=`echo "$i + 1" | bc | nocontinuation`; echo "$i"; done
Это будет довольно медленным, поскольку он порождает в каждой итерации. Чтобы избежать этого, можно повторно использовать один экземпляр bc
и общаться с ним через трубу:
#!/usr/bin/bash
set -e
nocontinuation(){ sed -u ':x; /\\$/ { N; s/\\\n//; tx }'; }
trap 'rm -rf "$tmpdir"' exit
tmpdir=`mktemp -d`
cd "$tmpdir"
mkfifo p n
<p bc | nocontinuation >n &
exec 3>p
exec 4<n
i=99999999999999999999999999999999999999999999999999999999999999999999;
while : ; do
echo "$i + 1" >&3
read i <&4
echo "$i"
done
с формой расширения бандажа, Баш должен расширить '{}' 1..100000000..1 ** ** первые , перед запуском цикла for. –