みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

macOS Sierraを使っています。bashが

macOS Sierraを使っています。bashが一定回数以上のループを実行した際、強制終了するようですが、強制終了させない方法はありませんか?
よろしくお願いします。

投稿日時 - 2017-02-04 14:56:09

QNo.9289683

困ってます

質問者が選んだベストアンサー

>(( i-- ))
>echo -n "$i "
>がdo部分で、
>(( i > 0 ))
>がwhileの条件になっています。

i=10000
while ((i--))
echo -n "$i "
((i>0))
do :
done

doの直前のコマンドのステータスがループ条件になります。do 部は何もしないコマンド : で。

投稿日時 - 2017-02-14 01:40:59

お礼

問題なくできました。whileの条件部分で複数コマンドを実行できることを利用して実現するとは思いつきませんでした。
ありがとうございました。

投稿日時 - 2017-02-16 00:26:10

ANo.4

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

> bashにdo~while文がないので

同等のことは出来ますけど、Cのdo while相当があるとしたら、どう書きたいですか?

ちなみに、CentOS6.8 だとエラーになりませんでした。
ulimit -a の結果を載せておきます。
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 3885
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240 <====10メガバイトですね。
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

投稿日時 - 2017-02-13 23:12:27

お礼

ご回答いただきまして、ありがとうございます。
どう書きたいかと言いますと…
No.1のお礼コメントのtest1関数がdo~whileの形式になっています。
(( i-- ))
echo -n "$i "
がdo部分で、
(( i > 0 ))
がwhileの条件になっています。
よろしくお願いいたします。

投稿日時 - 2017-02-14 01:10:08

ANo.2

No.1です

補足にあったコードを実行させた所、「Segmentation fault: 11」が出てました。また、このコードは関数を再帰的に呼んでますよね。bashの関数コール時の動作のについては詳しくないのですが、C言語などと同じように関数コールでスタックを消費するようなものであれば、2,000回ほどの再帰呼び出しで、スタックを消費してしまっているのではないでしょうか。

スタックサイズの不足が問題なら、サイズを変更すればと思ったのですが、どうも出来ないみたいですね。

役に立たない回答で申し訳ないです。

投稿日時 - 2017-02-07 00:46:49

お礼

ご回答いただきまして、ありがとうございます。
関数の再帰実行が原因なんですね。
bashにdo~while文がないのでこのやり方にしているのですが、もっとリソースを効率的に利用する方法があれば良いのですが…

投稿日時 - 2017-02-07 02:21:46

ANo.1

簡単なコードで、取り敢えずループカウンタを表示させて一千万を超えましたが、まだ動いてます。質問者様の仰る一定回数って何回ですか。本当にループの回数が原因ですか。

~~~~~~ コード ~~~~~~~
#!/bin/bash

count=0
while :
do
echo $count
let count++
done

投稿日時 - 2017-02-04 15:22:08

お礼

ご回答いただきまして、ありがとうございます。
実行したコマンドは以下の通りになります。

test1(){
(( i-- ))
echo -n "$i "
if (( i > 0 ))
then
${FUNCNAME[0]} $*
fi
}

i=10000
test1
と実行すると、8008で
[プロセスが完了しました]
になります。

よろしくお願い致します。

投稿日時 - 2017-02-06 21:06:58