2015-11-09 2 views
2

Как написать бесконечный цикл, эхом чисел от 1 до бесконечного в bash. Я использую для цикла, но он был убит при ударе об использовании значения больше, чем 100000000.Написание бесконечной петли bash

#!/bin/bash 
for a in {1..100000000..1} 
do 
    echo "$a" 
done 

любая альтернатива для него?

+0

с формой расширения бандажа, Баш должен расширить '{}' 1..100000000..1 ** ** первые , перед запуском цикла for. –

ответ

4

Это должно работать во всех 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

'$ ((i ++))' будет работать в любой оболочке POSIX; это не расширение. – chepner

+0

@chepner '$ ((i ++))' не работает в тире, но я заметил '$ ((i + = 1))' is и документирован. Я исправлю ответ. – PSkocik

+1

Моя ошибка, я не смотрел внимательно на то, что было * в * арифметическом выражении, только то, что 'expr' почти никогда не требуется. – chepner

5

Вы пробовали делать петлю while?

#!/bin/bash 

num=0; 

while : 
do 
    num=$((num+1)) 
    echo "$num" 
done 
+1

./test.sh: строка 7: num: команда не найдена –

+1

Пожалуйста, удалите пробелы вокруг '=', и в вашем примере у вас нет '$ a' – jayant

0

Разве вы не можете просто сделать while true;?

a=0 
while true; 
do 
    a=$((a+1)) 
    # $[$a+1] also works. 
    echo "$a" 
done 
+4

. Я бы это сделал, но вы используете недокументированный '$ [...]' синтаксис арифметических выражений. –

+1

Остерегайтесь того, что счетчик в конце концов переполнится. – karakfa

+0

Это отлично работает. –

Смежные вопросы