while文(実践)
前回は
while文と
繰り返しを制御する
continue と break を
教えてもらったね!
今回は
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 << EOF
フィナンシェ
シュークリーム
マドレーヌ
EOF
あっ!もしかして…
フィナンシェ
シュークリーム
マドレーヌ
おお!手入力以外の入力も
read で処理できるんだ!これは入力の1行ずつが
read 処理され入力の終わりに達するとread が失敗を返してwhile文が終了するんだつまり…入力の各行を順に処理できるんだね!これはすごい!
今回は
while文でシェルスクリプトを書いたよ!while文と read を組み合わせることで入力の各行を繰り返し処理できるんだ!これは入力の各行を処理する定番の書き方なんだ使う機会もあるので覚えておこう!
while read LINE
do
LINE変数を使った処理
done