自作のLinuxコマンドでオプションを追加しよう

$ ls -l

のようにコマンドの後に-lといったオプションを付けて実行すると、

total 12
drwxr-xr-x 4 pi pi 4096 Jul 16 10:21 go
-rw-r--r-- 1 pi pi  192 Jul 17 12:22 say.go
drwxr-xr-x 2 pi pi 4096 Jul  4 10:20 workspace

のようにオプションなしの時の実行と異なった結果が出力されます。


自作のLinuxコマンドで引数を使うで作成したsayコマンドにオプションを追加しながら、オプションについて学びます。


sayコマンドを作成する時に使用したGoでは、オプションを簡単に追加できるflagパッケージというものがありますので、今回はflagパッケージを用いてオプションを追加してみましょう。




sayコマンド実行時で -a というオプションを加えたら、出力する文字列の末尾にエクスクラメーションマーク(!)を付けるという機能を追加してみます。

flag package - github.com/shogo82148/std/flag - Go Packages


/home/pi/say.go

package main

import (
	"flag"
	"fmt"
)

func main() {
	var msg string
	var isAdd = flag.Bool("a", false, "Add exclamation mark(!)")

	flag.Parse()
	args := flag.Args()
	if len(args) == 1 {
		msg = args[0]
	}

	if *isAdd {
		msg += "!"
	}

	fmt.Println(msg)
}

$ go build say
$ sudo mv say /usr/local/bin/

でsayコマンドを使用できるようにし、動作を確認してみます。


最初に-aオプションなしで実行します。

$ say hoge
hoge

が出力されました。


次に-aオプションありで実行します。

$ say -a hoge
hoge!

末尾にエクスクラメーションマーク付きで出力されました。




Goで書いたコードを見ていきます。


var isAdd = flag.Bool("a", false, "Add exclamation mark(!)")

1つ目の値(第一引数)で指定する値でオプション(今回であれば-a)を使用可能にします。

2つ目の値(第二引数)では-aを指定しない時の初期値を設定し、今回はfalse(真偽の偽)にします。

3つ目の値(第三引数)は後述するヘルプ(-hや--help)オプション付きで実行した時に出力される値になります。


flag.Parse()

で実行するコマンドを解析します。


args := flag.Args()

ですが、前はos.Argsを使用していましたが、これだと-aも引数として扱われる為、今回であればhogeが何番目の引数に該当するか?が実行の度に変わってしまいます。


この問題を回避する為にflag.Args()を利用します。

flag.Args()の注意点として、os.Argsでは第一引数は必ず実行した時のコマンドそのもの(今回であればsay)でしたが、flag.Args()では第一引数にコマンドの次の値(今回であればhoge)になります。


他の細かい箇所はGoの書き方になりますので今回は触れません。




最後に

$ say --help

を実行してみます。

Usage of say:
  -a	Add exclamation mark(!)

という内容が出力されました。


var isAdd = flag.Bool("a", false, "Add exclamation mark(!)")

で設定した内容が出力されました。

マインクラフト用ビジュアルエディタを開発しています。
詳しくはinunosinsi/mcws_blockly - githubをご覧ください。