読者です 読者をやめる 読者になる 読者になる

シェルスクリプト

ルーチン化しそうな作業は、シェルスクリプトとして記述しながら実行していくと、後々楽だと今更気付いた。あんまり関係ないけど、zsh で複数行にまたがるコマンドを実行した後、一部だけ編集して再実行したいなという時に、1行目だけじゃなくて、複数行の編集ができるので便利。

以下、シェルスクリプト関連のメモ。

特殊変数

  • $# : 引数の個数

if 条件式

  • [ A -lt B ] : A < B ならば真
  • [ -d $dir ] : ディレクトリ $dir が存在するか

子プロセスの終了を待つ

ビルトインコマンドの wait を使う。

最初は ps -fe | grep process | grep -v grep | wc -l が 0 になったらみたいな事をやっていたけど、単純すぎて、ソースコード開いてるだけでも処理が止まったのが面白い(危ない)。

getopts

コマンドライン引数のパーサ。getopts の引数に a:b と渡していることのは、「 a はオプション値が必要で、b は必要でない」という意味。コロンを付与することでオプション値が必要だと教える。オプション値があってもなくてもいいときは :: と書く。オプション値は $OPTARG に保存されている。

下記の例では、指定されたオプションが OPT に渡されて、case 文で処理をする。getopts の引数で指定した以外のオプションを渡すと "*" が OPT に渡され、パースエラーが生じると "?" が渡される。

  while getopts a:b OPT
  do
    case $OPT in
      "a" )
          $VAR_A=$OPTARG
          ;;
      "b" )
          $FLG_B="TRUE"
          ;;
      "*" )
          exit 1
          ;;
      "?" )
          exit 1
          ;;
    esac
  done

ファイルのディレクトリ名

dirname コマンドで獲得する。ファイル名が欲しい時は basename コマンドを使う。

DIR=`dirname $0`