#!/bin/bash #if文で引数を区別する。課題ファイルを指定した場合、正しく実行される。 #引数に何も指定しなかった場合は'引数が多すぎます。'と出る。 #これを回避するためにcase文を使おうと思ったがうまくできなかった。 #if文だと'-o'で複数指定できる。 if [ $1 = kadai1-1_data.txt -o $1 = kadai1-2_data.txt -o $1 = kadai1-3_data.txt ] #引数を読み込んでpasteコマンドで1行にまとめ、line.txtへ。 #paste -s -d リスト #-s : ファイル内のすべての行を一行にする。 #-d リスト : 結合した行と行の間を区切る文字をリストで指定、今回はスペースにしたため""で囲んだ。 #catでファイル内をまず標準出力。この文字列をずらしていく。 then paste -s -d " " "$1" > line.txt cat line.txt #for文で文字の置換を指定回数繰り返させる。seqコマンドを使うと1~25まで書かなくていいため楽。 #元の文字列は先に出力しているため25回行う。 #まず元の文字列を1行にまとめたline.txtを1文字ずらしで置換し、alphabet.txtへ、それをcatで標準出力。 #そして、このalphabet.txtをline.txtへ出力。 #こうすることで次に置換される文字列は最初の文字列を1文字ずらしたものとなる。 #これを25回繰り返せば1~25までずらした文字列が得られる。 for i in `seq 1 25` do tr 'A-Za-z' 'B-ZAb-za' < line.txt > alphabet.txt cat alphabet.txt cat alphabet.txt > line.txt done #trコマンドで文字列を置換しているが、置換元と置換先の文字数は一致していなければならない。 #一致していなければ少ない方に合わせられる。また、置換するのは1文字目から順にである。 #具体的には #echo abc | tr 'abc' '123' とすると123と表示される。 #echo abc | tr 'abc' '12345'ならば45は無視されて123と表示される。 #cat file |tr 'a-zA-Z' 'b-za-bB-ZA-B'とすると小文字だけ上手くいくのは、 #置換元の'a-z'は置換先の'b-za'に順に対応しているからである。 #しかし、置換元の'A'は置換先の'b'に対応しているため、置換元の'B-Z'はそのまま'B-Z'になり、 #置換先の後ろのA-Bは数が合わないため無視される。 #このため、大文字は置換されていないように見える。 #最後に解読するために用意したファイルは削除。 rm line.txt alphabet.txt #また、他の引数だった場合、終わらせる。 else echo '課題ファイルを引数としてください。' fi