FreeBSD初心者運用日記 このページをアンテナに追加

 | 

2009-05-19

[]ユーザが指定した関数を、指定された2つのスクリプトの差分を取得するスクリプト 02:23 ユーザが指定した関数を、指定された2つのスクリプトの差分を取得するスクリプト - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - ユーザが指定した関数を、指定された2つのスクリプトの差分を取得するスクリプト - FreeBSD初心者運用日記 ユーザが指定した関数を、指定された2つのスクリプトの差分を取得するスクリプト - FreeBSD初心者運用日記 のブックマークコメント

※ minus_zeroさんからのコメントをサンプルコードに反映しました(05/27)

・サンプルコード

~$ cat apdiff
#!/bin/sh

usage() {
    echo "usage: apdiff [-v] file1 file2 funcname"
    exit
}

if [ "$1" = "-v" ]; then
    OPTION_VARBOSE="$1"
    shift
fi
if [ "$#" -lt 3 ]; then
    usage
fi
TARGET_FILE1="$1"
TARGET_FILE2="$2"
FUNC_NAME="$3"

if [ ! -e "$TARGET_FILE1" ]; then
    echo "$TARGET_FILE1 is not exists."
    usage
fi
if [ ! -e "$TARGET_FILE2" ]; then
    echo "$TARGET_FILE2 is not exists."
    usage
fi

TMP_FILE1=/tmp/apdiff.left.$$.dat
TMP_FILE2=/tmp/apdiff.right.$$.dat
if [ "$OPTION_VARBOSE" = "-v" ]; then
    echo "############################"
    echo "# $TARGET_FILE1"
    echo "############################"
    awk "/^$FUNC_NAME *\(\) *{/, /^}/" $TARGET_FILE1 | tee $TMP_FILE1
    echo ""

    echo "############################"
    echo "# $TARGET_FILE2"
    echo "############################"
    awk "/^$FUNC_NAME *\(\) *{/, /^}/" $TARGET_FILE2 | tee $TMP_FILE2
    echo ""
else
    awk "/^$FUNC_NAME *\(\) *{/, /^}/" $TARGET_FILE1 > $TMP_FILE1
    awk "/^$FUNC_NAME *\(\) *{/, /^}/" $TARGET_FILE2 > $TMP_FILE2
fi

if [ "$OPTION_VARBOSE" = "-v" ]; then
    echo "############################"
    echo "# DIFF"
    echo "############################"
fi
diff $TMP_FILE1 $TMP_FILE2

rm $TMP_FILE1
rm $TMP_FILE2


・実行結果(その1)

~$ apdiff  hoge.sh foo.sh bar
1a2
>       echo aaa
3d3
<       echo xxx
4a5
>       echo ddd

hoge.shとfoo.shのそれぞれのbar関数の差分を表示

・実行結果(その2)

~$ apdiff -v hoge.sh foo.sh bar
############################
# hoge.sh
############################
bar(){
        echo bbb
        echo xxx
        echo ccc
}

############################
# foo.sh
############################
bar(){
        echo aaa
        echo bbb
        echo ccc
        echo ddd
}

############################
# DIFF
############################
1a2
>       echo aaa
3d3
<       echo xxx
4a5
>       echo ddd

[]sdiffコマンドなるもの 02:15 sdiffコマンドなるもの - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - sdiffコマンドなるもの - FreeBSD初心者運用日記 sdiffコマンドなるもの - FreeBSD初心者運用日記 のブックマークコメント

diffの高機能版みたいなもので。とてもわかりやすい。

オプションlで、行が同じ場合は、左側のみ表示。ただし、左側のみに存在する行はやはり左側のみ表示されるだけなので少しわかりにくいかも。

オプションWで、diff -wと同じような意味になる。

[]シェルスクリプトの関数を抜き出す関数を作成してみた 01:42 シェルスクリプトの関数を抜き出す関数を作成してみた - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - シェルスクリプトの関数を抜き出す関数を作成してみた - FreeBSD初心者運用日記 シェルスクリプトの関数を抜き出す関数を作成してみた - FreeBSD初心者運用日記 のブックマークコメント

・サンプルコード

$ cat apget
#!/bin/sh

TARGET_FILE=$1
FUNC_NAME=$2

if [ "$TARGET_FILE" = "" -o "$FUNC_NAME" = "" ]; then
        echo "usage: apget file funcname"
        exit
fi

awk "/^$FUNC_NAME *\(\) *{/, /^}/" $TARGET_FILE

・実行結果

$ ./apget hoge.sh foo
foo(){
        echo foo
        echo foo
        echo foo

}

※ 第1パラメタにファイル名、第2パラメタに関数名を指定する

・補足

コマンドがどこからでも実行できるように環境変数PATHに値を追加する。

(1) ~/binを作成して、作成したapgetスクリプトを配下に格納する
(2) .bash_profileあたりに、export PATH=$PATH:~/binを入れておく
(3) ログインしなおすか、source .bash_profile(もしくは.bashrc)

minus_zerominus_zero2009/05/26 22:07こんにちは

とりあえず、すみません
最初のelse文はいらないと思います。
それと引数が3個ある判定も長いです。

if [ "$1" = "-v" ]; then
OPTION_VARBOSE="$1"
shift
fi
if [ "$#" -lt 3 ]; then
exit_flag=1
fi
TARGET_FILE1="$1"
TARGET_FILE2="$2"
FUNC_NAME="$3"

まあ、こんな感じかと・・(他にもやり方有りますが)

py4s-tnkpy4s-tnk2009/05/27 05:22>minus_zero様
こんにちは。
早速、サンプルコードのほうに反映させていただきました。
貴重なコメントありがとうございました。
勉強になりましたm(_ _)m

 |