【shellscript】getoptsでシェルスクリプトに引数機能を実装!【Linux】

10月 4, 2023

どもども、七分袖が大好きなsaisaiです(どうでもいい)。


先日とある機能をシェルスクリプトで実装すべく海外の方が作成したスクリプトをパトロールしていると見慣れないコマンド"getopts"を発見し、調べたところ非常に使い勝手が良さそうでしたので試してみました。


本日はその"getopts"コマンドを使用して自作したシェルスクリプトに引数機能を実装する様子をお届けしたいと思います。

そもそもgetopstsコマンドとは

getoptsコマンドとはbashのシェルスクリプト内でオプションを解析するコマンドです。


bashが内部的に備えているコマンドのため特に別途インストールは必要なく使用できます。


名前が似たコマンドに"getopt"コマンドがあるようですが。"getopt"コマンドは内部実装されたコマンドではなく、機能も少ないため今回は"getopts"コマンドを使用します。

さっそく使用してみる

それでは早速使用してみます。test.shという名前のシェルスクリプトを作成し、実行の際用いた引数によって出力結果を変えるようにしてみました。

#!/bin/bash

while getopts abc arg; do
    case "$arg" in
        a) echo "selected -a";;
        b) echo "selected -b";;
        c) echo "selected -c";;
        *) echo "selected another";;
    esac
done

実行結果は以下のようになりました。

$ ./test.sh -a
selected -a
$ ./test.sh -b
selected -b
$ ./test.sh -c
selected -c
$ ./test.sh -z
./test.sh: illegal option -- z
selected another

この通り実行する際に使用した引数によって出力内容を変更することができました!

getoptsを利用してIPアドレス、マックアドレス判別スクリプトを作成

Linuxなどのクライアント、サーバ内部からグローバルIPアドレス、ローカルIPアドレス、macアドレスを調べる際、それぞれコマンドが異なりいちいち覚えるのは大変です。


そこで今回はgetoptsコマンドを利用して引数に応じて各アドレスを返してくれるようなスクリプトを作成してみました。それがこちら!

#!/bin/bash

if [ -z $@ ]; then
echo -e "*usage::\n-l)local ip\n-g)grobal ip\n-m)mac address"
fi

while getopts lgm arg; do
    case "$arg" in
        l) hostname -I;;
        g) curl ifconfig.io;;
        m) ip a | grep 'ether' | awk {'print $2'};;
        *) echo "該当なし(ARG=$arg)";;
    esac
done

環境によってコマンドは変わってきそうですが、スクリプトを実行する際引数に"-l"を指定するとローカルIPアドレスを、"-g"でグローバルIPアドレスを、"-m"でマックアドレスを返すようにできました。


実際にcheckip.shという名前などでスクリプトを作成し、実行してみてください!

最後に

getoptsコマンドを使用すれば煩雑なif文などから解放されるかもしれませんね!


最近ではさらに使用しやすくなったオプション解析コマンドやコードが開発されているようです。ビルトインコマンドだけでなくサードパーティコマンドもどんどん探索していきたいものです。


他の方が作成したコードやスクリプトをパトロールすると新しい発見があり非常に楽しいですね!


最後まで読んでいただきありがとうございました!


↓オススメ教材

shellscript

Posted by CY