以前作成した、fizzbuzz.shを微調整しました。
前回はfizzbuzzを終了させる最大値をベタ書きしていましたが、引数化しました。
また、引数が入っていなかったり、数字以外のものが入っていた場合を想定し、引数のチェックを行う処理を最初に入れています。
(引数が複数入ってる状態については、最初の引数しか参照せず動作に問題ないため、今回は考慮していません。)
#!/bin/sh
expr 1 + $1 >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo “Please enter a correct parameter by number!”
exit 3
else
max=$1
fi
num=1
while :
do
fizz=`expr ${num} % 3`
buzz=`expr ${num} % 5`
if [ ${fizz} = 0 -a ${buzz} = 0 ]; then
echo “FizzBuzz”
elif [ ${fizz} = 0 ]; then
echo “Fizz”
elif [ ${buzz} = 0 ]; then
echo “Buzz”
else
echo ${num}
fi
num=`expr ${num} + 1`
if [ ${num} -gt ${max} ]; then
exit
fi
done
変更場所を太字で記載しています。(インデントが表示されないのはご愛嬌…)
【変更場所の説明】
[変更箇所1]
expr 1 + $1 >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo “Please enter a parameter !”
exit 3
else
max=$1
fi
exprで1+引数をする処理を行います。
exprは数式を計算するコマンドですが、
正しい数式を計算した場合は、返値は0、数式が抜けていたり、数字以外のものを計算しようとした場合は返値は2を返します。
pi@raspberrypi:~ $ expr 1 + 1
2
pi@raspberrypi:~ $ echo $?
0
pi@raspberrypi:~ $ expr 1 + a
expr: non-integer argument
pi@raspberrypi:~ $ echo $?
2
pi@raspberrypi:~ $ expr 1 +
expr: syntax error
pi@raspberrypi:~ $ echo $?
2
pi@raspberrypi:~ $
これを利用し、exprで1+引数を計算し、(出力は要らないので/dev/nullに捨てて)
返値は0なら、正しい引数、2なら異常な引数が指定されていると判断します。
引数が異常な場合は「Please enter a parameter !」と出力して返値が3で終了します。
そうでない場合は正常な引数であるとみなし、引数を変数「max」に代入します。
[変更箇所2]
if [ ${num} -gt ${max} ]; then
ベタ書きしていた最大値を変数「max」に置き換えています。
以上の修正で、安全に最大値を引数化することができました。
もう少し改善すべきことがありましたら、また改良してみようと思います。