シェルスクリプト

シェルスクリプトとは、Linux コンソール上で動作するスクリプトベースの実行ファイルです。MS-DOS で言うところのバッチファイル相当ですが、 より柔軟で複雑な処理もこなせます。
更新日 2016-02-13

概要

シェルスクリプトはテキストベースの為、vi 等で簡単に作成できます。プログラミング構文自体はBasic に似ています。以下の基本機能があります。

シェルの指定

スクリプトを実行するためのシェルを指定します。実行毎に(子)プロセスが作成されます。以下では一般的なシェルを指定しています。
#!/bin/sh

変数

プログラム中で変数を扱えます。変数を使う際には${}で括ってやります。なお変数は文字列として扱われます。
filename="/test.txt"
echo ${filename}

// 配列も可
dir[0]="/disk00"
dir[1]="/disk01"
dir[2]="/disk02"

echo ${dir[0]}
echo ${dir[1]}
echo ${dir[2]}

実行時の引数

シェルスクリプト実行時の引数は$1〜で参照できます。$0 はシェルスクリプト自身のパスです。
// /ReAllocateDiskSpace.sh /camera_avis1 /camera_avis2
echo $0  
echo $1
echo $2

比較

if 文が使えます。test は続く式の結果が真かどうかを判定します。
// param_A と param_B を比較 (-gt は数値として比較 >) 
param_A="50"
param_B="30"
if test ${param_A} -gt ${param_B}
then
  echo param_A >= param_B
else
  echo param_A < param_B
fi


// param_C が長さゼロなら真
param_C=""
if test -z ${param_C}
then
	echo param_C's length is zero.
fi
// 数値比較
-gt (greater than) >
-ge (greater equal) >=
-lt (less than) <
-le (less equal) <=
-eq (equal) =
-ne (not equal) !=

// 文字列比較
=  (equal string)
!= (not equal string)
-n (string length is not zero)
-z (string length is zero)

// 論理比較
-a (AND)
-o (OR)

文字列比較の謎

ダブルクォートで括るのは、文字列中にスペースがある場合の誤動作を避ける為。
if [ "$strA" != "$strB" ]
then
    echo Changed!
fi

ループ

for 文とwhile 文があります。
for i in "${dir[@]}"
do
    echo ${i}
done


while true
do
    date "+d +t"
    sleep 10
done

テンプレート

バックグラウンドで動くスクリプト

#!/bin/sh

vsftplog=/tmp/vsftplog

pname=$(echo $0 | sed -e "s/.*\/\([^/]*\)\.sh\$/\1/g")
file_log=/var/tmp/${pname}_log
log=/var/log/${pname}.log


case "$1" in
  start)
      pid=$(pgrep -f "${pname}.sh jobs")
      if [ -z $pid ]
      then
          nohup $0 jobs > /dev/null &
          echo Start ${pname}.sh ... [OK]
          date "+%D %T Start ${pname}.sh ... [OK]" >> $log
      else
          echo ${pname}.sh is already running ... [failed]
      fi
  ;;

  stop)
      pid=$(pgrep -f "${pname}.sh jobs")
      if [ -z $pid ]
      then
          echo ${pname}.sh is not running ... [failed]
      else
          kill $pid
          echo Stop ${pname}.sh ... [OK]
          date "+%D %T Stop ${pname}.sh ... [OK]" >> $log
      fi
  ;;

  status)
      cat $log | tail -20
      echo

      pid=$(pgrep -f "${pname}.sh jobs")
      if [ -z $pid ]
          echo [Status] ${pname}.sh is not running.
      else
          echo [Status] ${pname}.sh is running.
      fi
  ;;

  log)
      less $log
  ;;

  clear)
      echo > $log
  ;;

  jobs)
      
      # ここに処理を記述する

  ;;

  *)
      echo { start, stop, status, log, clear }
  ;;

esac

テンプレート