0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ubuntu(Linux)での独自コマンド定義のすゝめ ~引数を受け取ろう~

Posted at

はじめに

この記事は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

それではまた、明日の記事でお会いしましょう!

参考文献

シェルスクリプトにおける引数の受け取り方

シェルスクリプトにオプションを追加したい|hassy

シェルスクリプト オプション解析 徹底解説 (getopt / getopts) #Bash - Qiita

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?