vi コマンドを使って自分だけのコマンドをつくる Part.4

前回:Part.3

最後の課題として、より安全にコマンドを実行するための条件付けをします。

課題

  1. 該当するファイルが存在しない場合実行しないようにする
  2. 引数を指定し忘れた場合に実行しないようにする

該当するファイルが存在しない場合

if 文+ワイルドカードによるチェックを行います。

試しに「filecheck」というコマンドを作りました。

if ls スクリーンショット* > /dev/null 2>&1
then
  echo "ある!"
else
  echo "ない!"
fi

デスクトップ上で実行してみます。

「スクリーンショット」から始まる名前のファイルが存在する場合は

$ filecheck
ある!

となり、存在しない場合は、

$ filecheck
ない!

となります。

ちなみに、/dev/null にリダイレクトしないと

$ filecheck
スクリーンショット 2014-09-25 15.40.22.png		スクリーンショット 2014-09-25 15.40.37 2.png		スクリーンショット 2014-09-25 15.57.48.png
ある!
$ filecheck
ls: スクリーンショット*: No such file or directory
ない!

というふうに ls の実行結果が表示された上で echo 文が表示されます。

参考

引数を指定し忘れた場合

if 文によるチェックを行います。

試しに「paracheck」というコマンドを作りました。

if [ $1 ]
then
  para=$1
  echo "入力された引数は ${para} です"
else
  echo "引数を入力してください!"
fi

引数を入れずに実行すると…

$ paracheck
引数を入力してください!

引数を入れて実行すると…

$ paracheck hogehoge
入力された引数は hogehoge です

といったぐあいになります。

「flecheck」と「paracheck」を「ssmv」に盛り込む

ぜんぶ盛りました。

#ファイルが存在するかチェック(filecheck)
if ls スクリーンショット* > /dev/null 2>&1
then
  #引数1が入っているかチェック(paracheck)
  if [ $1 ]
  then
    #引数2が入っているかチェック(paracheck)
    if [ $2 ]
    then
      #引数の格納
      newfile=$1
      newdir=$2
  
      #スクリーンショットから始まるファイルをリネームする
      k=1
      for nowfile in スクリーンショット*
      do
        change="${newfile}-${k}.png"
        mv "${nowfile}" "${change}"
        k=`expr $k + 1`
      done
      
      #ディレクトリを作成し、画像を移動する
      mkdir ${newdir}
      mv ${newfile}*.png ${newdir}
    else
      echo "ERROR!: ssmv [filename] [dirname] : ディレクトリ名も入力してください"
    fi
  else
    echo "ERROR!: ssmv [filename] [dirname] : ファイル名とディレクトリ名を入力してください"
  fi
else
  echo "ERROR!: スクリーンショットとから始まる名前のファイルが存在しません"
fi

これをデスクトップ上で実行してみると…

スクショが見つからない場合

$ ssmv file directory
ERROR!: スクリーンショットとから始まる名前のファイルが存在しません

スクショはあるけどファイル名もディレクトリ名も入れていない場合

$ ssmv
ERROR!: ssmv [filename] [dirname] : ファイル名とディレクトリ名を入力してください

スクショはあるけどファイル名しか入れていない場合

$ ssmv file
ERROR!: ssmv [filename] [dirname] : ディレクトリ名も入力してください

といったぐあいにエラーがでます。

やったね!

めっちゃ入れ子でどうかと思いますが、いったんこれにておわり。

もっとスマートな書き方が身についたら手直ししたいと思います。