読者です 読者をやめる 読者になる 読者になる

for文のはなし

 シェルでそのままfor文を書いたことがなくてあれだったので。

$ for ((i=0;i<10;i++))
for> do
for> echo $i
for> done
0
1
2
...
もちろん、
$ for ((i=0;i<10;i++)); do; echo $i; done;
$ for ((i=0;i<10;i++)) do echo $i; done
$ for ((i=0;i<10;i++))do echo $i;done
でも同じ結果になる。forがコマンド名だからforと括弧の間は開けないとだめっぽい。

//a.outに0から10まで投げてhogeって文字列が出てきたらその数字を表示して入力待ちにする
$ for ((i=0;i<10;i++)) do if echo $i | ./a.out | grep hoge; then echo $i; read; fi; done;

ただこれだとhogeを含む文字列が表示されてしまうので、
正解の数字だけ表示してほしいときはgrep -qにする(--quiet)
$ for ((i=0;i<10;i++)) do if echo $i | ./a.out | grep -q hoge; then echo $i; read; fi; done;
a.outは正しい数字を受け取るとhogeを含む文字列を返す、というプログラムだとする。

逆に、間違った数字を受け取った時にerrorとか返してくれるプログラムなら、ifの否定で
$ for ((i=0;i<10;i++)) do if ! echo $i | ./a.out | grep -q error; then echo $i; read; fi; done;
とすれば、error以外の文字列を吐いてくれたときだけ正解の数字を出して止まってくれる。

数字だけじゃなくて文字も。
$ for i in {a..z} do echo $i; done

ちょっと調べた感じ、{}の表現:Brace expansionに関しては
Brace expansion [Bash Hackers Wiki]
がわかりやすく書いてた。