[Shell] ほぼ需要なし!ちょっと便利なシェルスクリプト

UNIX/Linuxで開発やテストなどの作業をしているとき、ちょっと便利になるようなシェルスクリプトをご紹介します。

たぶん、きっと、ほぼ需要はないことでしょう。自分の、自分による、自分のためのスクリプトです(笑)

基本的にはbashで動きますが、一部kshで作っているものもあります。kshで作っているものは、bashで動かすには処理の書き換えが必要な場合がありますので注意です。

Windows上のエディタで編集中のファイルにロックを掛ける

Linuxでファイルを編集するときは、viなどを使うことが多いと思いますが、Sambaで共有をかけてWindows上でファイル編集する方が楽、という方も多いと思います。

でも、もしWindows上で編集中に、他の人がLinux上で同じファイルを編集してしまったらどうなるでしょう。そんな状況を回避するために、vi用のファイルロックを掛けるスクリプトです。

#!/bin/ksh
#------------------------------------------------------------------------------#
#  Windows上のエディタで編集中のファイルにロックを掛けるシェル                 #
#------------------------------------------------------------------------------#
#    パラメータで指定されたファイルのスワップファイルを作成します。            #
#    また、バックアップ取り忘れ防止のため、バックアップも作成します。          #
#------------------------------------------------------------------------------#

# ------ ファイルが指定されていない場合は使い方を表示して終了
if [[ -z ${1} ]]; then
    echo "usage: \$ ${0##*/} file_name"
    exit 9
fi

# ------ 強制終了シグナルを無視する
trap "" 2

# ------ パラメータのファイル名を取得
FILENAME="${1}"

# ------ ロック用スワップファイル名を生成
SWAPNAME=".${FILENAME}.swp"

# ------ 既にバックアップファイルがある場合は一旦削除
if [[ -f ${FILENAME}.bak ]]; then rm -f ${FILENAME}.bak; fi

# ------ 現在のファイルをバックアップ
cp -a ${FILENAME} ${FILENAME}.bak

# ------ スワップファイルを作成しロックを掛ける
touch ${SWAPNAME}

# ------ Yキーが入力されたらスワップを削除してシェルを終了
while true; do
    echo -n "input 'y/Y' when end: "
    read inputKey
    if [[ "${inputKey}" = "y" || "${inputKey}" = "Y" ]]; then
        rm -f ${SWAPNAME}
        exit 0
    fi
done

#------------------------------------------------------------------------------#
# End of Files                                                                 #
#------------------------------------------------------------------------------#

指定秒間隔でファイル有無を監視する

ファイルが生成されるタイミングを試験する場合や、ファイルが生成されたあと自動で削除されているところのエビデンスが欲しい場合などに使います。

#!/bin/sh
#------------------------------------------------------------------------------#
#  ファイル監視                                                                #
#------------------------------------------------------------------------------#
#    指定秒間隔で、ファイル有無を監視します。                                  #
#    使用方法:                                                                #
#              $> ls_moni [監視間隔(秒)] [監視対象ファイル名]                  #
#------------------------------------------------------------------------------#

FILEOP="off"                            # 結果ファイル出力(on/off)
GDAY="`date +%Y%m%d%H%M%S`"             # 現在日付取得
LOGFILE="lsmoni_$GDAY.log"              # 結果出力ファイル名

STATUS="ok"                             # ステータス情報

# ----- パラメータチェック --------------------------------------------------- #
if [ $# -ne "2" ]; then
    STATUS="err"
fi

# ----- ファイル監視 --------------------------------------------------------- #
while [ "$STATUS" = "ok" ]; do
    if [ "$FILEOP" = "on" ]; then
        ls -la $2 > "$LOGFILE"
    elif [ "$FILEOP" = "off" ]; then
        ls -la $2
    else
        STATUS="err"
    fi
    sleep "$1"
done

# ----- エラー発生時 --------------------------------------------------------- #
if [ "$STATUS" = "err" ]; then
    echo "-----------------------------------------------------------------"
    echo "  ファイル監視シェル"
    echo "-----------------------------------------------------------------"
    echo "    ${0##*/} [time] [filename]"
    echo ""
    echo "      time      :  ファイル監視する間隔を秒数で指定"
    echo "      filename  :  監視するファイル名を指定(ワイルドカード可)"
    echo "-----------------------------------------------------------------"
    exit 9
fi

#------------------------------------------------------------------------------#
# End of Files                                                                 #
#------------------------------------------------------------------------------#

プロセスを起動して、すぐKILLする

単体試験を行うときに、KILLシグナルを受けての動作を確認するためのスクリプト。パラメータで指定したプロセスを起動し、即KILLします。

#!/bin/sh
#------------------------------------------------------------------------------#
#  プロセスを起動して、すぐKILLするシェル                                      #
#------------------------------------------------------------------------------#
#    プロセスが起動されているかチェックし、起動されていたらkill。              #
#    起動されていなかったら起動して、すぐkillする。                            #
#------------------------------------------------------------------------------#

# ----- パラメータ取得 ------------------------------------------------------- #
PARA1="$1"

# ----- パラメータで指定されたプログラムが存在したら ------------------------- #
if [ -f $PARA1 ]; then
    ALIVE=`ps ax | grep $PARA1 | grep -v grep | wc -l`
    if [ $ALIVE = "1" ]; then
        set `ps ax | grep $PARA1 | grep -v grep`
        kill $1
        echo "プロセスNo.$1  プロセス名:$PARA1  停止しました。"
    else
        $PARA1 &
        echo "プロセス名:$PARA1  起動しました。"

        set `ps ax | grep $PARA1 | grep -v grep`
        kill $1
        echo "プロセスNo.$1  プロセス名:$PARA1  停止しました。"
    fi

# ----- パラメータで指定されたプログラムが存在しなかったら ------------------- #
else
    echo "-----------------------------------------------------------------"
    echo "  プロセス起動後killシェル"
    echo "-----------------------------------------------------------------"
    echo "    ${0##*/} [filename]"
    echo ""
    echo "      filename : 起動・killするプログラム名"
    echo "-----------------------------------------------------------------"
fi

#------------------------------------------------------------------------------#
# End of Files                                                                 #
#------------------------------------------------------------------------------#

カレントディレクトリの全ファイル内を正規表現でgrep

複数のログファイルを出力するようなシステムで、ログファイルの中から特定のキーワードを検索したい場合に使うスクリプト。

#!/bin/sh
#------------------------------------------------------------------------------#
#  カレントディレクトリの全ファイル内を正規表現でgrep                          #
#------------------------------------------------------------------------------#
#  使用方法:$ cfgrep 検索パターン(正規表現)                                   #
#------------------------------------------------------------------------------#

if [ $# != 1 ]; then
    echo "-----------------------------------------------------------------"
    echo "  カレントディレクトリの全ファイル内を正規表現でgrep"
    echo "-----------------------------------------------------------------"
    echo "    ${0##*/} pattern"
    echo ""
    echo "      pattern  :  検索パターンをegrep準拠の正規表現で指定"
    echo "-----------------------------------------------------------------"
    exit 0
fi

for FILE in `ls`; do
    cat ${FILE} 2> /dev/null | egrep ${1} | while read CAT; do
        echo "[${FILE##*/}] ${CAT}"
    done
done

#------------------------------------------------------------------------------#
# End of Files                                                                 #
#------------------------------------------------------------------------------#

文字コード変換

UNIX環境からLinux環境へ移植する場合や、システム間で文字コードが違う場合に、指定した文字コードに変換するためのスクリプト。iconvを使うため、iconvがインストールされていることが前提です。

変換できる文字コードは、ASCII、EBCDIC、Shift-JIS、EUC-JPの4パターンです。

#!/bin/sh
#------------------------------------------------------------------------------#
#  文字コード変換シェル                                                        #
#------------------------------------------------------------------------------#
#    パラメータで指定された文字コードに変換して出力します。                    #
#    使用方法:                                                                #
#              $> wcnv sjis euc [ファイル名]     (Shift-JISからEUC-JPに変換) #
#              $> wcnv ascii ebcdic [ファイル名] (ASCIIからEBCDICに変換)     #
#------------------------------------------------------------------------------#

# ----- パラメータ取得 ------------------------------------------------------- #
PARA1="$1"
PARA2="$2"
PARA3="$3"

# ----- 実行プログラム関連設定 ----------------------------------------------- #
PRG="iconv"                             # 文字コード変換用
PRG_PARA=""                             # プログラム用パラメータ

# ----- その他設定 ----------------------------------------------------------- #
GDAY="`date +%Y%m%d%H%M%S`"             # 現在日付取得
ERRFLG="off"                            # エラー用フラグ

# ----- 文字コード ----------------------------------------------------------- #
ASCII="IBM-932"
EBCDIC="IBM-930"
SJIS="IBM-943"
EUCJP="EUC-JP"

# ----- 第一パラメータの判別 ------------------------------------------------- #
if [ "$PARA1" = "ascii" ]; then
    PRG_PARA1="-f $ASCII"
elif [ "$PARA1" = "ebcdic" ]; then
    PRG_PARA1="-f $EBCDIC"
elif [ "$PARA1" = "sjis" ]; then
    PRG_PARA1="-f $SJIS"
elif [ "$PARA1" = "euc" ]; then
    PRG_PARA1="-f $EUCJP"
else
    echo "第一パラメータの指定が違います。"
    ERRFLG="on"
fi

# ----- 第二パラメータの判別 ------------------------------------------------- #
if [ "$PARA2" = "ascii" ]; then
    PRG_PARA2="-t $ASCII"
    CODE="asc"
elif [ "$PARA2" = "ebcdic" ]; then
    PRG_PARA2="-t $EBCDIC"
    CODE="ebc"
elif [ "$PARA2" = "sjis" ]; then
    PRG_PARA2="-t $SJIS"
    CODE="sjis"
elif [ "$PARA2" = "euc" ]; then
    PRG_PARA2="-t $EUCJP"
    CODE="euc"
else
    echo "第二パラメータの指定が違います。"
    ERRFLG="on"
fi

# ----- 第三パラメータの判別 ------------------------------------------------- #
if [ "$ERRFLG" = "off" ]; then
    if [ -f $PARA3 ]; then
        if [ -f $PARA3.$CODE ]; then
            mv -f $PARA3.$CODE $PARA3.$CODE.$GDAY
            echo "変換先ファイル名が既に存在します。"
            echo "既存の $PARA3.$CODE を $PARA3.$CODE.$GDAY に変更しました。"
        fi
        $PRG $PRG_PARA1 $PRG_PARA2 $PARA3 > $PARA3.$CODE
        if [ $? = 0 ]; then
            echo "変換後のファイル $PARA3.$CODE を作成しました。"
            exit 0
        else
            echo "変換に失敗しました。"
            exit 9
        fi
    else
        echo "第三パラメータに指定されたファイルは存在しません。"
        ERRFLG="on"
    fi
fi

# ----- パラメータエラー時 --------------------------------------------------- #
if [ "$ERRFLG" = "on" ]; then
    echo "-----------------------------------------------------------------"
    echo "  文字コード変換シェル"
    echo "-----------------------------------------------------------------"
    echo "    ${0##*/} para1 para2 filename"
    echo ""
    echo "      para1      変換前文字コード"
    echo "      para2      変換後文字コード"
    echo ""
    echo "                 文字コード : ascii / ebcdic / sjis / euc"
    echo ""
    echo "      filename   変換するファイル名"
    echo "-----------------------------------------------------------------"
    exit 9
fi

exit 9

#------------------------------------------------------------------------------#
# End of Files                                                                 #
#------------------------------------------------------------------------------#

コメント

タイトルとURLをコピーしました