#!/bin/bash keta="$1" #実行時引数をketaという変数に代入する。 ketasu=`echo ${#keta}` #変数ketaに入っている文字、つまり実行時引数の文字数を知るために「echo ${#変数名}」コマンドによって求める。 #求めた文字数をketasuという変数に代入する。 moji=4 #変数mojiに数値4を代入しておく。 if [ $moji != $ketasu ] # ↑ この意味は「変数ketasuの値、つまり実行時引数の文字数が4(=変数moji)でない場合は」ということ。 then echo 桁数が間違っています。4桁の数字を入力してください。 # [ ]内が成立する場合はコマンド「echo」によって「 桁数が間違っています。4桁の数字を入力してください。」という文を表示する。 #この手順で、4 桁の数字以外のものを指定した場合にエラー処理を行なうことができる。 else #4桁の数字が指定された場合 cp kadai1_data.dat kadai1_1.txt #後々わかりやすくなるように名前を変えたファイルを作っておく cut -c 2-1000000 kadai1_1.txt > kadai1_2.txt cut -c 3-1000000 kadai1_1.txt > kadai1_3.txt cut -c 4-1000000 kadai1_1.txt > kadai1_4.txt #百万桁のうち、初めの1文字だけ消したファイル、2文字消したファイル、3文字消したファイルを作る。 fold -w 4 kadai1_1.txt > kadai1_1_4.txt fold -w 4 kadai1_2.txt > kadai1_2_4.txt fold -w 4 kadai1_3.txt > kadai1_3_4.txt fold -w 4 kadai1_4.txt > kadai1_4_4.txt #次にコマンド「fold」で4文字ごとにそれぞれたたむ。 grep -n $1 kadai1_1_4.txt > kekka1.txt grep -n $1 kadai1_2_4.txt > kekka2.txt grep -n $1 kadai1_3_4.txt > kekka3.txt grep -n $1 kadai1_4_4.txt > kekka4.txt #実行時引数$1が、4文字ごとにたたんだファイルの何行目に出てくるのか調べる。 head -n 1 kekka1.txt | cut -d: -f1 > kotae1.txt head -n 1 kekka2.txt | cut -d: -f1 > kotae2.txt head -n 1 kekka3.txt | cut -d: -f1 > kotae3.txt head -n 1 kekka4.txt | cut -d: -f1 > kotae4.txt #1行目の1フィールド目に、そのファイルで1番始めに引数が出た行が何行目か書かれているので、それを切り取る。 K1=`cat kotae1.txt` K2=`cat kotae2.txt` K3=`cat kotae3.txt` K4=`cat kotae4.txt` #切り取った数字を変数に代入する。 echo "($K1 * 4)-3" | bc > kotae01.txt echo "($K2 * 4)-2" | bc > kotae02.txt echo "($K3 * 4)-1" | bc > kotae03.txt echo "$K4 * 4" | bc > kotae04.txt #何桁目なのかを計算する。 cat kotae01.txt kotae02.txt kotae03.txt kotae04.txt > kotae05.txt #4つの結果を1つにまとめる。 sort -t: -k1n kotae05.txt > kotae_jun.txt head -n 1 kotae_jun.txt | cut -d: -f1 > kotae.txt #1番小さい数が答えになるので、それが先頭にくるようにしたい。 #コマンド「sort」で小さい順に並べて、1行目の1フィールド目を切り取る。 KOTAE=`cat kotae.txt` #結果を変数KOTAEに代入する。 #次に引数が百万桁の中にない場合のことを考える。 #引数が百万桁の中にないとき、kotae05.txtの中身は空になる。 K05=`cat kotae05.txt` #kotae05.txtの中身を変数K05に代入する。 MOJISUU=`echo ${#K05}` #K05の文字数を変数MOJISUUに代入する。 if [ $MOJISUU = 0 ] #MOJISUUが0の場合すなわち実行時引数が百万桁の中にない場合 then echo 探している4桁の数字は円周率百万桁の中には存在しません。 else echo $1は円周率の小数点以下$KOTAE桁目から始まります。 #実行時引数が百万桁の中にある場合 fi rm kadai1_*.txt rm kekka*.txt rm kotae*.txt #途中で作ったファイルを消去する。 fi