概要
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))"が定石。case:getoptsで取り出したオプションを分岐処理するのに使用。printf/echo:ヘルプ表示やエラーメッセージの整形に。read:非オプション引数の対話入力が必要な場合に補助。
備考
- 対応環境:POSIX 準拠の
sh(dash, ksh 等)、bash、zsh、BusyBoxashで利用可能。挙動は概ね互換ですが、細部は各シェルの実装に従います。 - 長いオプション:
getoptsは短いオプション前提(-a,-b val)。長い--optionを扱いたい場合は自前で処理するかgetopt、zshならzparseoptsなどを検討。 - エラー処理:先頭に
:を付けるサイレントモード+OPTERR=0で、自動エラー文を抑止し統一されたメッセージにできます。 - 再入性:同一シェルで再度解析する場合は
OPTIND=1に戻すか、関数内でlocal OPTINDを使う。 --の扱い:--は「ここでオプション終了」の意味。ファイル名が-で始まる場合の誤解釈防止に有効。- 設定ファイル:
getoptsに対応する設定ファイルはありません(スクリプト内ロジックのみで制御)。
参考
- POSIX
getopts仕様(The Open Group)
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html - Bash Reference Manual(Bourne Shell Builtins /
getopts)
https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#index-getopts bash(1)マンページ
https://man7.org/linux/man-pages/man1/bash.1.html- Zsh での引数解析(
zparseopts)
https://zsh.sourceforge.io/Doc/Release/Expansion.html#index-zparseopts

コメント