Windows 10 Anniversary UpdateからサポートしたWSL(Windows Subsystem for Linux)。その結果としてWindows 10上でもBashを始めとするLinuxコマンドが利用可能になった。本連載ではWSLに関する情報や、Bashから実行するシェルスクリプトを紹介する。

コマンドラインからキーを指定可能にする

過去2回(第24回/第25回)にわたってWindows 10のReg.exeコマンドの出力結果を、BUW(Bash on Ubuntu on Windows)のdiffコマンドで比較するシェルスクリプトを書いていたが、日常的に使うには少々使いにくい。それは対象となるレジストリキーを固定しているからだ。そこで、今回はシェルスクリプトを普段から使えるようにするため、コマンドラインオプションを強化し、任意のレジストリキーを比較可能にする。

さらに既存のシェルスクリプトでは、colordiffの出力結果をビューアーのlessに直接渡していたが、今回はファイルとして出力し、後から参照できるように変更しよう。そのために用いるのは過去の連載でも利用しているBashの内部関数「getopts」だ。今回はターゲットとなるレジストリキーと、出力先となるファイル名が必要となるため、「:(コロン)」を付けて引数を変数に代入する。また、レジストリキーおよびファイル名の指定がない場合はエラーになってしまうため、シェルスクリプト側でエラーチェックルーチンを追加することにした。

このような前提で作成したのが下記のシェルスクリプトである。いつもどおり、vimなどのテキストエディターにコピー&ペーストし、chmodコマンドで実行権限を付与してから、お試し頂きたい。

 #!/bin/bash

 CMDNAME=`basename $0`

 function usage() {
    echo "Usage: $CMDNAME -k Key -f OutputFile" 1>&2
    exit 0
 }

 while getopts :k:f: Option
 do
    case $Option in
        k )
            if [ -z "$OPTARG" ]; then
                echo usage;
            fi
            Flag_K="TRUE"
            TargetKey=$OPTARG ;;
        f )
            if [ -z "$OPTARG" ]; then
                echo usage;
            fi
            Flag_F="TRUE"
            FileName=$OPTARG ;;
        \?* )
            usage ;;
    esac
 done

 if [ $# -ne 4 ]; then
    echo "オプションが不正です." 1>&2
    exit 1
 fi

 shift $((OPTIND - 1))

 if [ "$Flag_K" = "TRUE" -a "$Flag_F" = "TRUE" ]; then
    Option='/s /reg:64'
    BeforeFile=/mnt/c/Users/kaz/Desktop/$$tmp1.txt
    AfterFile=/mnt/c/Users/kaz/Desktop/$$tmp2.txt

    reg.exe query $TargetKey $Option > $BeforeFile
    read -p "操作を終えたら[Enter]キーを押してください."
    reg.exe query $TargetKey $Option > $AfterFile
    colordiff -a -u $BeforeFile $AfterFile > $FileName

    rm $BeforeFile $AfterFile
 fi

まずは実行結果からご覧頂こう。オプション「ー?」を付けた場合はシェルスクリプトの使い方を示し、引数が足りない場合はエラーになる。オプション「-k」の引数にレジストリキー、オプション「-f」の引数にファイル名を指定すると、前回と同様に1度現在のレジストリファイルを出力してから一時停止。この間に操作を行い、[Enter]キーを押すと再びレジストリファイルの出力を実行して、その比較結果を指定したファイルに出力する。

今回のシェルスクリプトはレジストリキーとファイル名を指定する

シェルスクリプト実行後は指定したファイルが生成される

生成したファイルをlessで開いた状態。これで後からじっくりと検証できる

冒頭で述べたように5~28行目はオプション操作に関するコード。変数「OPTARG」に格納された引数を各変数に代入している。ポイントは30~33行目のif文。今回のシェルスクリプトは、2つのオプションと2つの引数が必要になるため、引数の合計値が「4」以外の場合はechoでメッセージを出力し、エラーコード1で終了する。

阿久津良和(Cactus)