Report 4





課題
課題1:Script版 ls ( myls )

指定したディレクトリ・ファイルの内容を表示するコマンド myls を作成せよ.
但し,ディレクトリと通常のファイルは分けて表示しディレクトリの後ろには"/" を表示すること

実行結果例
 $ ls -FC /foo
 dir1/   file1    dir2/   file2
 $ myls /foo
 dir1/
 dir2/
 file1
 file2

スクリプトのソース
#!/bin/sh

#引数を受け取る
ps=$1
#エラーメッセージを定義
ER="USAGE: myls [dir] "
#引数が2以上だったら
if [ $# -ge 2 ] ; then
   echo "Warning!! Too Many Arguments"
   echo $ER
   echo "-----shell exit"
   #スクリプトを終了
   exit
fi

#ディレクトリを指定していなかったらカレントディレクトリを代入
if [ -z $ps ] ; then
   ps="./"
fi

#psがディレクトリだったら
if [ -d $ps ] ; then
#fileにls -1でリストを代入、
    file=`( cd $ps ; ls -1 )`

#リストを一つずつ見ていく
    for koo in $file
      do
#ディレクトリーだったら変数dirに代入
      if [ -d "${ps}/$koo" ] ; then
          dir="$dir $koo/"
      else
#ファイルだったら変数filに代入
          if [ -f "${ps}/$koo" ] ; then
              fil="$fil $koo"
          fi
      fi
    done
    echo "--------------dir---------"
#表示色を変更
    echo -n "^[[31m"
#dirの中身を表示
    for bbb in $dir
      do
      echo $bbb
    done
#色を初期化
    echo -n "^[[00m"
    echo "--------------file-------"
#色を変更
    echo -n "^[[37m"
    for aaa in $fil
      do
      echo $aaa
done
#色の初期化
    echo -n "^[[00m"
#引数がファイルだったらls -lで詳細を表示
else
    if [ -f $ps ] ; then
        echo "caution!! $ER"
        echo ""
        echo `ls -l $ps`
        echo ""
        echo "--------shell exit"
        exit
    else
#ディレクトリでもファイルでもなかったらエラーメッセージを表示して終了
        if ( [ ! -d $ps ] || [ ! -f $ps ] ) ; then
            echo ""
            echo "Warning!! No Such File or Directory!"
            echo $ER
            echo "----------shell exit"
            exit
        fi
    fi
fi

#emacsで^[を入力するにはCq+escを使う

実行結果
[j03040:~/works/jikn/report4] j03040% myls
--------------dir---------
dir1/
dir2/
dir3/
--------------file-------
kdkd
lr
mylower
myls
myls.sh
mylsuza
mymv
myupper
sum55
test.eps
test2.eps


課題2
ファイル名を一括で小文字から大文字(myupper),拡張子の変更(mymv)が可能なコマンドmyrename を作成せよ.

myupperのソース
#!/bin/sh

#エラーメッセージを定義
ER="usage : myupper [file name]"

#引数を順番に読み込む
for f do

#引数がNULLだったらエラーメッセージを表示して終了
  if ( [ -z $f ] ) ;then
      echo "Warning! To few Arguments!"
      echo "--------exit"
      exit
  else
#引数がディレクトリだったらエラーメッセージを表示して終了
      if ( [ -d $f ] ) ; then
          echo "$f is not file"
          echo $ER
          echo "----shell exit"
          exit
      fi
  fi

#引数がファイルだったら大文字変換の処理
  if ( [ -f $f ] ) ; then
#変数eにtrで大文字に変換した結果を代入
      e=`echo $f | tr "[a-z]" "[A-Z]"`
      echo "$f ---> $e"
#mvでファイル名変更
      mv $f $e
  else
#引数がファイルぢゃなかったらエラーメッセージを表示して終了
      echo "---No Such File---"
      echo $f
      echo "--------------------System exit"
      exit
  fi
done

mymvのソース
 
#!/bin/sh
#エラーメッセージを定義
ER="usage : mymv [file Argument] [file name]"

#引数が2以下だったらエラーメッセージを表示して終了
if [ $# -lt 2 ] ; then
    echo "-----Argument Error!-----"
    echo $ER
    exit
fi

#toarに変換後の拡張子を代入
toar=$1
#引数を一つずらす
shift
list=""
#引数を順番に読み込む
for koko
  do
#指定されたファイルが無かったらエラーメッセージを表示して終了
  if [ ! -f $koko ] ; then
      echo "$koko is not found!"
      echo "-------shell exit"
      exit
  else
#ファイルが存在したらlistに代入
      list="$list $koko"
  fi
done

for file in $list
  do
#ファイルから拡張子を抜き出す
  ar=`expr "$file" : ".*\.\(.*\).*"`
#tofileに拡張子を変更したファイル名を代入する
  tofile=`basename $file $ar`$toar

#ファイル名変換確認
  while [ 1 ]
  do
    echo -n "$file -----> $tofile     rename?(yes/no)  "
#キーボードから文字を受け取る
    read yn
#受け取った文字に応じて処理する
    case $yn in
#yes/yとだったらファイル名を変更して終了
        yes|y)
             mv $file $tofile
             break
             ;;
#no/nだったら何もせずに終了
        no|n)
             break
             ;;
#それ以外の文字だったら繰り返す
         *)
             echo "please enter yse or no"
             continue
             ;;
     esac
  done
done 

実行結果
 
[j03040:jikn/report4/dir1] j03040% ls
lr*  myupper*  sum55*
[j03040:jikn/report4/dir1] j03040% myupper lr sum55
lr ---> LR
sum55 ---> SUM55
[j03040:jikn/report4/dir1] j03040% ls
LR*  SUM55*  myupper*

[j03040:jikn/report4/dir2] j03040% ls
mymv*  test.ps  test2.ps
[j03040:jikn/report4/dir2] j03040% mymv eps *.ps
test.ps -----> test.eps     rename?(yes/no)  y
test2.ps -----> test2.eps     rename?(yes/no)  h
please enter yse or no
test2.ps -----> test2.eps     rename?(yes/no)  n
[j03040:jikn/report4/dir2] j03040% ls
mymv*  test.eps  test2.ps


感想
optionを指定するってやつができなかった、、、、
getoptsの使い方は分かったけど、引数の扱い方がいまいち、、、、、
ま、時間があればmyrenameも作ってみようかと思います。

もどる