getopts – ショートオプションを安全に解析する(シェル組み込み)

コマンドリファレンス

概要

getopts はシェルスクリプト内で -a-b value のような「短いオプション」を安全に解析するための組み込みコマンドです。位置パラメータ($@)から順に読み取り、対応する変数やエラー処理を行います。
実務では、引数チェック・ヘルプ表示・必須オプションの検証など、堅牢な CLI スクリプトづくりに使います。

構文(Syntax)

getopts OPTSTRING VARNAME [ARGS...]

# 例
# OPTSTRING: 受け付けるオプション集合(末尾に : を付けると引数必須)
#   先頭に ':' を付けるとサイレントモード(自動エラーメッセージ抑制&挙動変更)
# VARNAME: 取り出したオプション文字が入る変数名(1文字。例: opt)
# ARGS...: 省略時は位置パラメータ($@)を解析、指定時はその配列を解析

主なオプション一覧

getopts 自体に一般的なフラグはありません。ここでは OPTSTRING の書き方関連変数 を「オプション」として整理します。

オプション説明使用例
a-a を受け付ける(引数不要)getopts 'a' opt
b:-b ARG を受け付ける(引数必須)getopts 'ab:' opt
:ab:(先頭の:サイレントモード:必須引数欠如は VARNAME=':'、不正オプションは VARNAME='?'OPTARG に問題の文字getopts ':ab:' opt
--(引数側)以降をオプション解析せずそのまま残す区切りcmd -a -- -b は位置引数
OPTARG引数付きオプションの値、またはエラー時の問題文字が入るecho "$OPTARG"
OPTIND次に読み取る引数の位置(初期値1)。解析後に shift "$((OPTIND-1))" が定石OPTIND=1; while getopts ...; do ...; done
OPTERR=0自動エラーメッセージ(stderr)を抑制(先頭:無しでも抑制可能)OPTERR=0; getopts 'ab:' opt

実行例

基本:-a(フラグ)と -b ARG(値付き)を解析

説明:よくある最小構成。解析後に残りの引数へ shift します。
コマンド

cat > /tmp/demo_getopts.sh <<'SH'
#!/usr/bin/env bash
flag_a=0
b_val=''
while getopts ':ab:' opt; do
  case "$opt" in
    a) flag_a=1 ;;
    b) b_val="$OPTARG" ;;
    \?) echo "不正なオプション: -$OPTARG" >&2; exit 2 ;;
    :)  echo "オプション -$OPTARG には引数が必要です" >&2; exit 2 ;;
  esac
done
shift "$((OPTIND-1))"
printf 'a=%s\nb=%s\n残り=%s\n' "$flag_a" "$b_val" "$*"
SH
bash /tmp/demo_getopts.sh -a -b 42 file1 file2

出力例

a=1
b=42
残り=file1 file2

-- でオプション終端を指定

説明-- 以降は - で始まっても位置引数として扱います。
コマンド

bash /tmp/demo_getopts.sh -a -- -b not-option

出力例

a=1
b=
残り=-b not-option

サイレントモード(先頭 :)で独自エラーメッセージ

説明:自動メッセージを抑制し、欠落や不正を自分で処理します。
コマンド

cat > /tmp/silent.sh <<'SH'
#!/usr/bin/env bash
OPTERR=0                # 念のため自動メッセージ抑止
while getopts ':x:' opt; do
  case "$opt" in
    x) echo "x=$OPTARG" ;;
    :) echo "xの引数が足りません" ; exit 2 ;;
    \?) echo "対応していない: -$OPTARG" ; exit 2 ;;
  esac
done
SH
bash /tmp/silent.sh -x

出力例

xの引数が足りません

関数内での再利用(local OPTIND)

説明:関数ごとに OPTIND をローカル化すると、他の解析と干渉しません。
コマンド

cat > /tmp/func.sh <<'SH'
#!/usr/bin/env bash
parse() {
  local OPTIND opt
  local v=''
  while getopts ':v:' opt; do
    case "$opt" in
      v) v="$OPTARG" ;;
      :) echo "-v に引数が必要" ; return 2 ;;
      \?) echo "未知: -$OPTARG" ; return 2 ;;
    esac
  done
  shift "$((OPTIND-1))"
  printf 'v=%s | 残り=%s\n' "$v" "$*"
}
parse -v hello foo bar
parse foo -v world bar
SH
bash /tmp/func.sh

出力例

v=hello | 残り=foo bar
v=world | 残り=

エラー例:不正なオプション

説明:許可していない -z を与えると ? 分岐に入ります。
コマンド

bash /tmp/demo_getopts.sh -z
echo $?

出力例

不正なオプション: -z
2

関連コマンド

  • getopt:外部コマンド。長いオプション(--long)の整形に使えるが、環境差が大きく取り扱い注意。
  • shift:解析済みの引数を取り除く。shift "$((OPTIND-1))" が定石。
  • casegetopts で取り出したオプションを分岐処理するのに使用。
  • printf / echo:ヘルプ表示やエラーメッセージの整形に。
  • read:非オプション引数の対話入力が必要な場合に補助。

備考

  • 対応環境:POSIX 準拠の sh(dash, ksh 等)、bashzsh、BusyBox ash で利用可能。挙動は概ね互換ですが、細部は各シェルの実装に従います。
  • 長いオプションgetopts は短いオプション前提(-a, -b val)。長い --option を扱いたい場合は自前で処理するか getoptzsh なら zparseopts などを検討。
  • エラー処理:先頭に : を付けるサイレントモード+OPTERR=0 で、自動エラー文を抑止し統一されたメッセージにできます。
  • 再入性:同一シェルで再度解析する場合は OPTIND=1 に戻すか、関数内で local OPTIND を使う。
  • -- の扱い-- は「ここでオプション終了」の意味。ファイル名が - で始まる場合の誤解釈防止に有効。
  • 設定ファイルgetopts に対応する設定ファイルはありません(スクリプト内ロジックのみで制御)。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント