はじめに
この記事はUdon Advent Calendar 2025 - Adventarの10日目の記事です。
Ubuntu(Linux)での独自コマンド定義
去年のUdon Advent Calendarでこんな記事を書きました。
この記事はこれの続きとなります。「紹介できたらいいな~」と書いてあった「引数の受け取り」をやってみようと思います。
引数の受け取り
コマンドを使うとき、よく以下のような引数を添えることがあります。
example_command test foo
example_command -v
example_command --version
自作のコマンドでは、こういった引数をどう受け取ればいいのかを調べてみました。
-が付いていないもの
example_command test foo
このようにコマンドが呼ばれることを想定します。
これらの引数を変数に格納し、出力してみるサンプルプログラムは以下の通りです。
#!/bin/bash
arg_1=$1
arg_2=$2
echo $1
echo $2
渡された引数は$1, $2, ...といった風に格納されています。それを扱いやすいように別の変数に代入し、それを出力する、といった流れとなります。
出力結果は以下のようになります。
$ example_command test foo
test
foo
また、以下のようなものもあります。
-
$0:スクリプトの名前が格納されている -
$#:引数の数が格納されている(スクリプト名も含む) -
$*:全ての引数(スクリプト名を除く)を1個の文字列にまとめたもの -
$@:全ての引数(スクリプト名を除く)を個別の文字列にまとめたもの
たとえば$@を用いると以下のようなことができます。
#!/bin/bash
for arg in "$@"
do
echo "$arg"
done
実行結果は以下のように、全ての引数が順次出力される形となります。
$ example_command test foo bar
test
foo
bar
これにて引数をスクリプト内で受け取り、利用することができるようになりました。
-が付いているもの(オプション)
-が付いた引数はオプションで、これによって処理を変えたりしたいときに利用されます。
-が付いているといっても引数であることには変わりなく、
#!/bin/bash
v_selected="false"
h_selected="false"
i_selected="false"
# Parse options using getopts
while getopts ":vhi-:" opt; do
case $opt in
v)
v_selected="true"
;;
h)
h_selected="true"
;;
i)
i_selected="true"
;;
-)
case "${OPTARG}" in
version)
v_selected="true"
;;
help)
h_selected="true"
;;
input)
i_selected="true"
;;
*)
echo "Invalid option: --${OPTARG}"
exit 1
;;
esac
;;
\?)
echo "Invalid option: -$OPTARG"
exit 1
;;
esac
done
エラーメッセージだけでなく、オプション一覧を表示するようにしてもよいかもしれませんね。--helpが選ばれた時や存在しないオプションが指定されたときなどには以下のように定義した説明書をメソッドを通して表示すると良さそうです。
show_help() {
echo "Usage: example_command [OPTIONS]"
echo ""
echo "Options:"
echo " -v, --version Show version information"
echo " -h, --help Display this help message"
echo " -i, --input Specify input option"
}
引数のバリデーションはのちの処理のバグを減らせるので、受け取り時に行うのが望ましいでしょう。
そして、どのオプションが指定されているかの情報は変数に格納してあるので、あとはこれを利用した条件分岐によって処理を分けてあげればよいわけです。
おわりに
コマンドで引数を受け取るにはどういった実装をすればいいのかが分かりました。
面倒な操作をまとめたスクリプトをコマンドにしてしまう、というのはよくやるし、たまにGitHubに公開したりもするので、オプションを付けたりして様々な状況に対応できるようにしておくのは大切だと思います。
また、オプションが増えてきても大丈夫なように--helpもしっかり用意したほうが良さそうですね。
大規模なコマンドになってくると、オプションも複雑化してきます。そういったときは以下の記事にあるようなオプション解析用ツールをスクリプトに組み込むのも一つの方法ですね。
シェルスクリプト オプション解析 徹底解説 (getopt / getopts) #Bash - Qiita
それではまた、明日の記事でお会いしましょう!