vi コマンドを使って自分だけのコマンドをつくる Part.4
前回:Part.3
最後の課題として、より安全にコマンドを実行するための条件付けをします。
課題
- 該当するファイルが存在しない場合実行しないようにする
- 引数を指定し忘れた場合に実行しないようにする
該当するファイルが存在しない場合
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] : ディレクトリ名も入力してください
といったぐあいにエラーがでます。
やったね!
めっちゃ入れ子でどうかと思いますが、いったんこれにておわり。
もっとスマートな書き方が身についたら手直ししたいと思います。