シェルスクリプト – if文とcase文
お久しぶりです。mnakamuraです。 以前に単純なシェルスクリプトについての記事を公開しましたが、 今回はif文とcase文を使って、単純な占いが出来る機能を、 段階ごとに勉強しながら作成してみましょう。 特に制約等はありませんが、今回はAmazonLinux2023の検証機で実施します。 まずは単純なif文の分岐。testコマンドのオプション -f でファイルが存在するか判定します。 存在する場合は「user.txt」の中身を表示し、存在しなければファイルを作成します。
[root@mnakamura-AmazonLinux2023 shellscript]# pwd /root/shellscript [root@mnakamura-AmazonLinux2023 shellscript]# ll -A total 0 [root@mnakamura-AmazonLinux2023 shellscript]# vi if.sh [root@mnakamura-AmazonLinux2023 shellscript]# cat if.sh #!/bin/bash if test -f user.txt then cat user.txt else touch user.txt fi
[root@mnakamura-AmazonLinux2023 shellscript]# ll -d if.sh -rw-r--r-- 1 root root 76 May 21 13:49 if.sh [root@mnakamura-AmazonLinux2023 shellscript]# chmod 744 if.sh [root@mnakamura-AmazonLinux2023 shellscript]# ll -d if.sh -rwxr--r-- 1 root root 79 May 21 13:55 if.sh [root@mnakamura-AmazonLinux2023 shellscript]# sh if.sh [root@mnakamura-AmazonLinux2023 shellscript]# ll -A total 4 -rwxr--r-- 1 root root 79 May 21 13:55 if.sh -rw-r--r-- 1 root root 0 May 21 13:55 user.txt [root@mnakamura-AmazonLinux2023 shellscript]# cat user.txt [root@mnakamura-AmazonLinux2023 shellscript]#
「if.sh」というシェルスクリプトを作成し、権限を与えて実行しました。 占いを実行するユーザーの名前をこのファイルに入力する想定なのですが、 このままだと中身が入力されません。少しシェルスクリプトに手を加えます。
[root@mnakamura-AmazonLinux2023 shellscript]# vi if.sh [root@mnakamura-AmazonLinux2023 shellscript]# cat if.sh #!/bin/bash if test -f user.txt then username=$(cat user.txt) if test -z $username then read -sp "中身が空なのでユーザー名を入力して下さい。:" username echo "ユーザー名は" $username "です。" echo $username > user.txt else echo "ユーザー名は" $username "です。" fi else echo "そもそもファイルが存在しないので、作成します。" touch user.txt fi
if文の中に更にif文を作成して入れ子構造で分岐させる事を「ネスト」と言います。 「user.txt」の中身が無い場合は、readコマンドで中身のユーザー名を入力し、表示します。 中身がある場合は、そのまま表示します。無い場合は作成です。 「user.txt」を一旦削除し、再度実行してみます。
[root@mnakamura-AmazonLinux2023 shellscript]# rm user.txt rm: remove regular file 'user.txt'? y [root@mnakamura-AmazonLinux2023 shellscript]# ll -A total 4 -rwxr--r-- 1 root root 441 May 21 14:38 if.sh [root@mnakamura-AmazonLinux2023 shellscript]# sh if.sh そもそもファイルが存在しないので、作成します。 [root@mnakamura-AmazonLinux2023 shellscript]# sh if.sh 中身が空なのでユーザー名を入力して下さい。:ユーザー名は mnakamura です。 [root@mnakamura-AmazonLinux2023 shellscript]# sh if.sh ユーザー名は mnakamura です。 [root@mnakamura-AmazonLinux2023 shellscript]# ll -A total 8 -rwxr--r-- 1 root root 441 May 21 14:38 if.sh -rw-r--r-- 1 root root 10 May 21 14:39 user.txt [root@mnakamura-AmazonLinux2023 shellscript]# cat user.txt mnakamura
上記の通り、2回実行する事で、「user.txt」の中身に入力したユーザー名が保存されました。 しかし、どうせなら1回実行するだけで完結させたいですよね。 一度ユーザー名を入れたらその後もう一度実行しなくてよいようにします。
[root@mnakamura-AmazonLinux2023 shellscript]# rm user.txt rm: remove regular file 'user.txt'? y [root@mnakamura-AmazonLinux2023 shellscript]# vi if.sh [root@mnakamura-AmazonLinux2023 shellscript]# cat if.sh #!/bin/bash if test -f user.txt then username=$(cat user.txt) if test -z $username then read -sp "中身が空なのでユーザー名を入力して下さい。:" username echo "ユーザー名は" $username "です。" echo $username > user.txt else echo "ユーザー名は" $username "です。" fi else echo "そもそもファイルが存在しないので、作成します。" touch user.txt username=$(cat user.txt) if test -z $username then read -sp "中身が空なのでユーザー名を入力して下さい。:" username echo "ユーザー名は" $username "です。" echo $username > user.txt else echo "ユーザー名は" $username "です。" fi fi
大枠のelse文で、ファイルが存在しない場合にも同様の処理を実行するように記述しました。 この状態で何度か実行してみましょう。
[root@mnakamura-AmazonLinux2023 shellscript]# sh if.sh そもそもファイルが存在しないので、作成します。 中身が空なのでユーザー名を入力して下さい。:ユーザー名は mnakamura です。 [root@mnakamura-AmazonLinux2023 shellscript]# sh if.sh ユーザー名は mnakamura です。 [root@mnakamura-AmazonLinux2023 shellscript]# sh if.sh ユーザー名は mnakamura です。 [root@mnakamura-AmazonLinux2023 shellscript]# sh if.sh ユーザー名は mnakamura です。
上記の通り、初回実行時にはユーザー名を入力しますが、 一度入力すれば、「$username」にユーザー名が格納される為、 次回以降はユーザー名を表示するだけです。 ユーザー名が決定したら、今度はcase文を使用し、 特定の数字に合わせた運勢を出力する占いのスクリプトを作成してみましょう。 1から9までの数字を入れたら、その数字に合わせて運勢が出力されます。 尚、条件外の入力をした場合は、「大凶」になるようにします。 では、echoを使って、出力が見やすくなるように改行を入れつつ作成してみます。
[root@mnakamura-AmazonLinux2023 shellscript]# vi if.sh [root@mnakamura-AmazonLinux2023 shellscript]# cat if.sh #!/bin/bash if test -f user.txt then username=$(cat user.txt) if test -z $username then read -sp "中身が空なのでユーザー名を入力して下さい。:" username echo "ユーザー名は" $username "です。" echo $username > user.txt else echo "ユーザー名は" $username "です。" fi else echo "そもそもファイルが存在しないので、作成します。" touch user.txt username=$(cat user.txt) if test -z $username then read -sp "中身が空なのでユーザー名を入力して下さい。:" username echo "ユーザー名は" $username "です。" echo $username > user.txt else echo "ユーザー名は" $username "です。" fi fi echo $username"さん、今日の運勢を占います。" read -sp "半角で1から9までの好きな数字を1つ入力してください。" unsei echo echo "$unsei ですね…今日の運勢は…" if expr "$unsei" : "[1-9]*$" >&/dev/null ;then echo echo echo case $unsei in 1) echo "大凶です。占いなんてやめましょう。";; 2) echo "大凶です。自分の頭で考えましょう。";; 3) echo "大凶です。他のことに時間を使いましょう。";; 4) echo "大凶です。良いことは自分の力で引き寄せましょう。";; 5) echo "大凶です。残念ながら。";; 6) echo "大凶です。占いには科学的な根拠なんて多分ないです。";; 7) echo "大凶です。スピリチュアルは身を滅ぼすかもしれません。";; 8) echo "大凶です。それよりも勉強しましょう。";; 9) echo "大凶です。占いよりも身近な人に親切にしましょう。。";; esac echo echo echo else echo "大凶です。そもそも" $unsei "は半角の1から9までじゃないです。" echo echo echo fi
まずは「user.txt」を一旦削除し、ファイルがない状態にします。
[root@mnakamura-AmazonLinux2023 shellscript]# rm user.txt rm: remove regular file 'user.txt'? y
それでは実行してみましょう。 初回なのでユーザー名登録からですね。 まずはラッキー7という事で、7を入力してみます。
[root@mnakamura-AmazonLinux2023 shellscript]# sh if.sh そもそもファイルが存在しないので、作成します。 中身が空なのでユーザー名を入力して下さい。:ユーザー名は mnakamura です。 mnakamuraさん、今日の運勢を占います。 半角で1から9までの好きな数字を1つ入力してください。 7 ですね…今日の運勢は… 大凶です。スピリチュアルは身を滅ぼすかもしれません。
酷い結果です…。 次は指示に従わず、「v」という文字を入力してみましょう。 ユーザー名は登録されているので、そこは再度入力しなくて良いはずです。
[root@mnakamura-AmazonLinux2023 shellscript]# sh if.sh ユーザー名は mnakamura です。 mnakamuraさん、今日の運勢を占います。 半角で1から9までの好きな数字を1つ入力してください。 v ですね…今日の運勢は… 大凶です。そもそも v は半角の1から9までじゃないです。
大凶ですね。ルールは守りましょう。 もう一度やってみます。
[root@mnakamura-AmazonLinux2023 shellscript]# sh if.sh ユーザー名は mnakamura です。 mnakamuraさん、今日の運勢を占います。 半角で1から9までの好きな数字を1つ入力してください。 1 ですね…今日の運勢は… 大凶です。占いなんてやめましょう。
…ダメ押しでもう一回。
[root@mnakamura-AmazonLinux2023 shellscript]# sh if.sh ユーザー名は mnakamura です。 mnakamuraさん、今日の運勢を占います。 半角で1から9までの好きな数字を1つ入力してください。 8 ですね…今日の運勢は… 大凶です。それよりも勉強しましょう。
…おとなしくIT学習に励みます。 それではまたお会いしましょう。