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
スクリプトが終わってプロンプトが表示されたよ!でも…このスクリプトは役に立つのかな?手入力した内容の空行を削除されても…
そのまま実行しても面白みがいよねこのスクリプトは入力リダイレクトやパイプなどと組み合わせて使うんだ以下のようにしてみよう!
./remove-empty-lines << EOF
フィナンシェ
シュークリーム
マドレーヌ
EOF
あっ!もしかして…
フィナンシェ
シュークリーム
マドレーヌ
おお!手入力以外の入力も
read
で処理できるんだ!これは入力の1行ずつが
read
コマンドで処理され入力の終わりに達するとread
が失敗を返してwhile
文が終了するんだつまり…入力の各行を順に処理できるんだね!これはすごい!
今回は
while
文でシェルスクリプトを書いたよ!while
文と read
を組み合わせることで入力の各行を繰り返し処理できるんだ!これは入力の各行を処理する定番の書き方なんだ使う機会もあるので覚えておこう!
while read LINE
do
LINE変数を使った処理
done