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