Lから始まるLinux

3章4話
if文(使い方)
3章5話 if文(実践)
もくじ
3章6話
case文(使い方)
if文(実践)
若木 みどり
前回はif文の 使い方を学んだね!
若木 しげる
今回はif文を使った シェルスクリプトを書いて 実際にどのようなものか 学んでいこう!
実践
若木 しげる
今回はパスワード強度をチェックする check-passwd スクリプトを 作ってみよう!
若木 みどり(驚き)
おお! 本格的な内容そう!
若木 しげる
以下でエディタを開いてね
vim check-passwd
若木 みどり
うん!準備万端だよ!
若木 しげる
内容は以下のようにしよう
#!/bin/bash

echo -n "パスワードを入力して下さい: "
read -s PASSWORD

if [ "$(echo -n "$PASSWORD" | wc -m)" -lt 8 ]
then
  echo "パスワードは8文字以上にしましょう"
elif [ -z "$(tr -cd a-z <<< "$PASSWORD")" ]
then
  echo "パスワードには英小文字を含めましょう"
elif [ -z "$(tr -cd A-Z <<< "$PASSWORD")" ]
then
  echo "パスワードには英大文字を含めましょう"
elif [ -z "$(tr -cd 0-9 <<< "$PASSWORD")" ]
then
  echo "パスワードには英数字を含めましょう"
else
  echo "良いパスワードです!"
fi

若木 しげる
スクリプトの内容を見てみようif文の前まではどういう動きをするのかな?
echo -n "パスワードを入力して下さい: "
read -s PASSWORD
若木 みどり
これは readパスワード入力を求めているよ!ただし -s オプションで入力を画面表示しないようになっているね入力されたパスワードを覗き見されるのを防いでくれているんだ!
若木 みどり
また readカーソルがあるだけだとユーザは何をしていいのかわからないのでecho で入力を促すメッセージを表示してユーザがパスワード入力すれば良いことを伝えているね!
若木 しげる
そのとおりだね!ここは readおさらいのような感じだね

若木 しげる
次はif文の中に入っていこう最初のコマンドは何をしているのかな?
[ "$(echo -n "$PASSWORD" | wc -m)" -lt 8 ]
若木 みどり
むっ…これはちょっと読み解くのが難しいかも
若木 しげる
こういうときは分解して考えよう[ "$( ... )" -lt 8 ] と考えてコマンド展開 $( ... ) の部分は後回しで考えよう!
若木 みどり
なるほど!コマンド展開 $( ... )考えいないようにすると「コマンド展開の結果が8より小さければ」と読めるね
若木 みどり
その後にコマンド展開の内容を分けて考えればいいんだ!
若木 みどり
read で受け取ったPASSWORD 変数の値をecho で表示してそれを wc に渡して文字数を数えているねこれは入力されたパスワードの文字数を表示している処理になると思うよ!
若木 みどり
まとめると「入力されたパスワード文字数が8より小さければ」という判定処理をしているんだね!
若木 しげる(笑顔)
よくできました!そのとおりの処理になっているよ
若木 みどり
この判定処理が成功したら「パスワードは8文字以上にしましょう」と表示するんだね!

若木 しげる
次は elifコマンドを読んでみよう!
[ -z "$(tr -cd a-z <<< "$PASSWORD")" ]
若木 みどり
これも最初はコマンド展開は考えないようにするね
若木 みどり
それなら…「コマンド展開の結果が空文字なら」という判定処理になっているよ!
若木 みどり
コマンド展開の中身を見るとtr で文字列の加工をするのかな加工内容はヒアドストリング <<<PASSWORD 変数の値を入力しているね
若木 みどり
tr-c, -d オプションと a-z 引数で「英小文字(a-z)以外の文字を削除」という処理になるはず!
若木 みどり
以上を合わせると「パスワードから英小文字以外を削除して0文字だったら」もっとわかりやすく言い換えると「パスワードに英小文字が含まれていなかったら」という判定処理なっているんだ!
若木 しげる(笑顔)
ちょっと難しかったけど良く読めたね!その理解のとおりだよ!
若木 みどり
この判定処理が成功したら「パスワードには英小文字を含めましょう」と表示してくれるというわけなんだね!
若木 しげる
後に続いているelif のコマンドも「英大文字(A-Z)」「英数字(0-9)」同じようなことをしているだけなんだ

若木 しげる
最後は else の処理だね
echo "良いパスワードです!"
若木 みどり
最後の else に到達するということは今までの悪いパスワードの条件判定が失敗つまり全て当てはまらなかった場合に実行される処理だよ
若木 みどり(笑顔)
ここまで到達したら「良いパスワードです!」合格がもらえるんだね!
若木 しげる(笑顔)
よくできました!
まとめ
若木 みどり
このパスワード合格の条件って結構厳しくないかな?
若木 しげる
これは自分のシェルスクリプトなんだもし自分に合わないと思う所あれば好きなように書き換えていいんだよ
若木 みどり(驚き)
そっか!
若木 しげる
こうやって学びながら自分好みにカスタマイズするのも良い勉強になるから条件を変えたりメッセージを工夫したりして自分だけのオリジナルのスクリプトを作ってみるといいよ!
若木 みどり
今回の例題はハードだったけどとても勉強になったよ!お兄ちゃんの言うとおりこれを元に色々書き換えて試してみる!