Lから始まるLinux

3章10話
while文(使い方)
3章11話 while文(実践)
もくじ
3章12話
制御文とリダイレクト
while文(実践)
若木 みどり
前回はwhile文と 繰り返しを制御する continuebreak 教えてもらったね!
若木 しげる
今回はwhile文を使った シェルスクリプトを 書いてみよう!
実践
若木 しげる
今回は空行を削除する remove-empty-lines スクリプトを 作成しよう! まずはエディタを開いてね
vim remove-empty-lines
若木 みどり
うん!
若木 しげる
次に以下の内容を入力して保存しよう
#!/bin/bash

while read LINE
do
  grep -sq '^ *$' <<< "$LINE" && continue
  echo "$LINE"
done
若木 みどり
内容が少なくてシンプルだね!
若木 しげる
記述は少ないけど学ぶものは多いものに仕上がっているんだ!

若木 みどり
whileのコマンドの所でread を使っているねコマンドが成功する限り繰り返すんだけどread の成功って何なんだろう?
若木 しげる
入力があれば成功なければ失敗になるよこれは後で実行して確認するね

若木 しげる
while文の処理を見てみよう以下の1行は何をしているかな
grep -sq '^ *$' <<< "$LINE" && continue
若木 みどり
AND 演算子 && を使って前半のコマンドが成功したらcontinue をしているね
若木 みどり
肝心の前半だけど…LINE 変数の内容をgrep で検索しているね検索内容は正規表現 ^ *$これは「スペースが任意の数ある行」つまり「空行」となるよ
若木 みどり
つまり LINE 変数の値が空行ならこの繰り返しを終えて次の繰り返しに移るということだね!

若木 しげる
処理の2行目は単純だけど1行目と組み合わせるとどんな動きになるのかな?
echo "$LINE"
若木 みどり
1行目で「空行」ならcontinue しているので「内容のある行」だけ表示という意味になるね!最初のスクリプトの説明のとおり空行を削除したものが表示されるんだ!
実行
若木 しげる
今回はwhile文とread を組み合わせた動きを知るために実行権限を与えて動かしてみよう!
chmod a+x remove-empty-lines
若木 みどり
うん!準備 OK だよ!
若木 しげる
では実行してみよう!
./remove-empty-lines
若木 みどり
親切な入力メッセージは付けていないから何も表示されていないけど入力を受け付ける状態になっているんだね
若木 しげる
そのとおり!空ではない文字列を入れてEnter を押してみよう!
バウムクーヘン
若木 みどり
これで Enter を押すね
バウムクーヘン
バウムクーヘン

若木 みどり
空行じゃなかったのでecho で内容を表示して次の繰り返しのread が実行されたね!
若木 みどり
この処理を終えるのにはどうすればいいのかな?文字を入れず Enter かな?
若木 しげる
それだと「空文字」入力したことになるんだ何も文字を入れていない状態でCtrl + D を押してみよう!これは「入力の終わり」伝える操作だよ
若木 みどり
remove-empty-lines スクリプトが終わってプロンプトが表示されたよ!
若木 みどり
でも…このスクリプトは役に立つのかな?手入力した内容の空行を削除されても…
若木 しげる
そのまま実行しても面白みがいよねこのスクリプトは入力リダイレクトやパイプなどと組み合わせて使うんだ以下のようにしてみよう!
./remove-empty-lines << EOF

フィナンシェ


シュークリーム

マドレーヌ
EOF
若木 みどり(驚き)
あっ!もしかして…
フィナンシェ
シュークリーム
マドレーヌ
若木 みどり(驚き)
おお!手入力以外の入力もread で処理できるんだ!
若木 しげる
これは入力の1行ずつがread コマンドで処理され入力の終わりに達するとread が失敗を返してwhile文が終了するんだ
若木 みどり(笑顔)
つまり…入力の各行を順に処理できるんだね!これはすごい!
まとめ
若木 みどり
今回はwhile文でシェルスクリプトを書いたよ!while文と read を組み合わせることで入力の各行を繰り返し処理できるんだ!
若木 しげる
これは入力の各行を処理する定番の書き方なんだ使う機会もあるので覚えておこう!
while read LINE
do
  LINE変数を使った処理
done