開発作業の忙しさが続くと、人とあまり合わなくなって、すぐにヒゲがボッサになりがちな、ユゲタです。
九九のコーディングもこなれてきて、言語別にやる際には、移植作業チックになっている状態ですが、
言語ごとに、いろいろな制約や、問題点などに気がつくので、まあまあの面白みを感じています。
そんな感じで、本日は、shellで九九を表示してみます。
実践で使うことはほぼなさそうですけどね・・・
本日のIT謎掛け
「Bash」と、かけまして・・・
「前世を覚えている人」と、ときます。
そのココロは・・・
新しく生まれ変わった(born[Bourne] again shell)そうです・・・
Shellで九九表示にtry
普通に9x9のマトリクス表示をしてみたいと思います。
#!/bin/bash
for i in `seq 9`;
do
str=""
for j in `seq 9`;
do
a=`expr $j "*" $i`
if [ "${str}" = "" ];then
str="$j×$i=$a"
else
str="${str}\t$j×$i=$a"
fi
done
echo "${str}"
done
他の言語と同じように、for文2つをかけ合わせて表示する方法です。
$ sh 001.sh
1×1=1 2×1=2 3×1=3 4×1=4 5×1=5 6×1=6 7×1=7 8×1=8 9×1=9
1×2=2 2×2=4 3×2=6 4×2=8 5×2=10 6×2=12 7×2=14 8×2=16 9×2=18
1×3=3 2×3=6 3×3=9 4×3=12 5×3=15 6×3=18 7×3=21 8×3=24 9×3=27
1×4=4 2×4=8 3×4=12 4×4=16 5×4=20 6×4=24 7×4=28 8×4=32 9×4=36
1×5=5 2×5=10 3×5=15 4×5=20 5×5=25 6×5=30 7×5=35 8×5=40 9×5=45
1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36 7×6=42 8×6=48 9×6=54
1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49 8×7=56 9×7=63
1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64 9×8=72
1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81
実行すると、こんな感じです。
解説すると、for文は"seq 9"という、1-9の配列を作ってくれる関数で構築し、内部計算はshellは"expr"コマンドで行わないと行けないので、めんどくさいですが、$aに格納しています。
そして、行と列に分けて表示(マトリクス表示)するために、行毎に文字列を生成してます。
その際に、セル単位の区切りでタブを使うことによって、キレイに整列させることができました。
他の書き方でtry
shellには、for文で、書き方が何通りも存在します。
ということで、上記とは違った書き方でプログラミングしてみます。
#!/bin/bash
for ((i=1;i<=9;i++));do
for ((j=1;j<=9;j++));do
a=`expr $j "*" $i`
arr[j]="$j×$i=$a"
done
echo -e "${arr[@]}"
done
$ bash 002.sh
1×1=1 2×1=2 3×1=3 4×1=4 5×1=5 6×1=6 7×1=7 8×1=8 9×1=9
1×2=2 2×2=4 3×2=6 4×2=8 5×2=10 6×2=12 7×2=14 8×2=16 9×2=18
1×3=3 2×3=6 3×3=9 4×3=12 5×3=15 6×3=18 7×3=21 8×3=24 9×3=27
1×4=4 2×4=8 3×4=12 4×4=16 5×4=20 6×4=24 7×4=28 8×4=32 9×4=36
1×5=5 2×5=10 3×5=15 4×5=20 5×5=25 6×5=30 7×5=35 8×5=40 9×5=45
1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36 7×6=42 8×6=48 9×6=54
1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49 8×7=56 9×7=63
1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64 9×8=72
1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81
全体的に短くなったように感じますが、デメリットもありました。
前回との違いも含めて解説します。
まず、for文の書き方が他の言語のように書くことができるんですが、注意点として、shではなく、bashで実行してください。
次に、bashでechoする時に、内部のエスケープ文字が機能しないので、-eオプションを付け忘れないようにしましょう。
最後に、表示を文字列で格納していたのを、配列に変えてみましたが、shellでは、joinというコマンドはあるけど、他のプログラムのjoinとは使い方が違うので、IFS機能を使うしかないのですが、単純に表示しようとしてタブ区切りにするという事ができないようです。
IFS自体は、タブを区切り文字にすることはできるんですが、出力するタイミングでスペースになってしまうようです。
IFSの細かな説明は、以下のページにかかれていました。
https://toshi-hirasawa.hatenadiary.org/entry/20110915/1316089062
ここは、joinに相当する関数を作るか、for文で表示させるしかなさそうです・・・orz
とりあえず、shell言語の限界が見えたということで、今回は締めたいと思います。
0 件のコメント:
コメントを投稿