シェルスクリプト練習問題(初級編)の正解例と解説

こちらのシェルスクリプト練習問題(初級編)の正解例と解説をします。
http://g-network.boo.jp/wiki/2018/02/post-895/ 
 

シェル名 shell_syokyu_01.sh
処理内容 英数字1文字の引数を与えてシェルを実行した際に、それぞれ以下のような処理をすること。
アルファベット大文字→「アルファベット大文字」と表示
アルファベット小文字→「アルファベット小文字」と表示
数字→「数字」と表示
その他→「アルファベットか数字1字を指定してください」と表示
※case文を使うこと

【正解例】

このスクリプトは引数は1つでアルファベットか数字1字を想定しているが、引数の個数が多い時のために引数の個数をチェックしています。
 
次のcase文では[A-Z]で大文字1字、[a-z]で小文字1字、[0-9]で数字1字を表すことができる。ちなみに、[A-Z][A-Z]とつなげることで2字を表すこともできる。 *を使ってその他の場合の分岐を作ることで、引数がどんな値でも対応できるようにしている。
 
 

シェル名 shell_syokyu_02.sh
処理内容 while文でリストファイル(shell_syokyu_02.lst)を読み込んでループ処理を実施し、リストファイルに書かれている文字列を全行echoコマンドで表示する。

【正解例】

リストファイルは変数に代入して使用する。また念のため初めにリストファイルの有無を確認しておく。
 
上記のようにwhile read にリダイレクトでリストファイルを指定することで、リストファイルの中身を1行ずつ読み込み処理をすることができる。ループ処理はfor文などでもできるが個人的にはこの方法を使う場合が多い。むしろfor文を使ったことがほとんどない。
 
 

シェル名 shell_syokyu_03.sh
処理内容 引数で指定したディレクトリにおいて、ファイル名に大文字と小文字が混ざったファイルを小文字のみに変換する。引数なしで実行された場合はエラーメッセージを出力して終了させること。

【正解例】

実際に運用シェルを作成する場合は上記のようにヘッダーに機能や引数を記載する。
 
初めに引数チェックや、ディレクトリ有無のチェックをして、ない場合はexitさせてリネーム処理は実行しないようにする。基本的にメイン処理に入る前に無駄な処理をさせないように判定処理を入れる場合が多い。
 
find ${DIR} -maxdepth 1 -type f | while read 
上記の部分は、findコマンドの結果をパイプでwhile文に渡してループ処理させている。maxdepthオプションは${DIR}で指定したディレクトリのみ対象として、それより深い階層は対象にしないようにしている。
 
FILENAME_AFTER=echo ${FILENAME} | tr [:upper:] [:lower:]
trコマンドはこのような書式で大文字を小文字に変換してくれる。
 
ファイル名に大文字が含まれていなかった場合は、そのままmvコマンドを実行してしまうと、変更前と後が同じファイル名になってしまいエラーとなるため、continueで次のループにいくようにしている。
 
mv ${FULL_PATH} ${DIR}/${FILENAME_AFTER} > /dev/null 2>&1
上記のようにmvコマンドの結果は標準出力、エラー出力ともに画面に出力しないようにしておき、直後に特殊変数の$?でコマンドの実行結果を判別し、エラーならメッセージを画面に出す仕様としている。画面に無駄な出力が出ないようにするのは基本だが、よく忘れがちなので注意。
 
 
次は練習問題(中級編)にチャレンジ!!
http://g-network.boo.jp/wiki/2018/02/post-909/ 

スポンサーリンク
勉強wikiの下部広告
  • このエントリーをはてなブックマークに追加
スポンサーリンク
勉強wikiの下部広告

コメントをどうぞ

メールアドレスが公開されることはありません。

CAPTCHA