比較的新しいもので評価しています)苦労の甲斐あってか、最近はshだけでも色々書けるようになってきました。制御関連は良く分かっていなかったので、これを中心に復習していきます。今回は、whileとforを例を挙げて練習してみます。※サンプル中のshebangは省略しています(shで実行すればshebangも実行権も要らないので)。標準入力を1行ずつ処理するwhileは他の言語同様、評価が真の場合はブロック内の処理を繰り返します。評価が真というのは、shの場合はステータス($?)が0の場合を指します。下記のサンプルは、標準入力から得たものを行番号をつけて出力します。while.sha\ta^Z$whileは、readが0を返す限りブロック内(do〜done)を繰り返し処理します。TABが何故か出力されないのですが、ファイルではなく入力待ち状態から実行(2回目)してみるとちゃんとタブは出力されました。今のところ、何故こうなるかは分かりません。(a\taのところは実際はTABキーで入力、^Zは"Ctrl+Z"のことでEOFになります。)コマンドを数回試行するshスクリプトで、コマンドのリトライ制御を今まで見たことがなかったので、自分で考えてみました。これが良いやり方なのかどうかちょっと自身はありません。forでやってみます。forは、スクリプト言語で言うforeachにあたる処理で、与えられたリストを1要素ずつ処理します。for.sh124$inの後ろにスペース区切りの要素リストがあれば、それを繰り返し処理するので、*を指定すればカレントディレクトリのファイルリスト(オプションなしlsと同じ)が得られ、ファイルごとの処理が出来ます。これを利用して、コマンドの試行処理を書いてみます。end$上手くいきました。ここで、ちょっと気になる点があります。試行回数を10回とか20回に変えたいとしたらどうしましょう。PerlやRubyでは、..演算子で連続した値のリストを作ることができます。shの場合はどうするのか分からないので、これも考えてみました。ひとつは、もう"外"の力に頼ってしまう方法。retryの部分は省略しています。loop1.sh++++++++++++++++++++++++++++++++$Perlにリストを作ってもらいます。上記の処理では、スペースで区切られた32個のゼロが返されるので、CONTで指定した32回の繰り返しが実現できます。書けますが、Perlが分からないと意味不明ですし、このくらいはshだけでなんとかしたいところです。そこで、次はループカウンタを使ってやってみました。一般的な言語のforeachでないほうのforと同じことをすれば良いわけです。最初からここに行き着けば良かったのですが、考えすぎてたようです。loop2.sh++++++++++++++++++++++++++++++++$これは上手くいくのですが、とても遅くなりました。最初のもそうですが、whileは遅いのでしょうか。最後は、ひとつ前と同じですが、trueを使ってループの中で条件判定を行っています。trueは必ず0を返す"コマンド"です。(2)プロフィールid:argiusはてなブログをはじめよう!argiusさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。