📖
bashの引数処理の例
bashの引数処理の例です。
入門UNIX シェルプログラミング 改訂第2版
のp.152、6.3.4 その他のオプション処理方法
を参考にしました。
以下の例では、ショートオプション(-dなど)とロングオプション(--debugなど)の指定、またオプションの設定値の有無の指定、オプション無しの引数の指定が可能です。
以下のとおりbashスクリプトファイルrun.sh
を作成します。
run.sh
#!/bin/bash
# エラー時にエラーメッセージを表示して停止するように設定。
set -eu -o pipefail
trap 'EXIT_STATUS="${?}"; echo "ERROR: file = "${0}", line no = "${LINENO}", exit status = "${EXIT_STATUS}"" >&2; exit "${EXIT_STATUS}"' ERR
# あらかじめデフォルトの値をセットしておく。
NAME=""
DEBUG="false"
# その他のオプション無し引数は配列「OTHER_ARGS」に格納する。
# その配列サイズを保持する変数。
OTHER_ARGS_SIZE="0"
# 引数の処理。${#}は引数の配列のサイズ。shiftコマンドで順次減っていく。
while [ "${#}" -gt "0" ]
do
# 変数${1}は引数の配列の先頭の要素。shiftコマンドで引数の配列の先頭から順番に要素が削られていく。
case "${1}" in
-n|--name)
# -nまたは--nameオプションの直後の引数は、変数${NAME}にセットしたい値。
# 直後に引数がなければエラーで終了。
if [ "${#}" -lt "2" ]; then
echo "Missing parameter of the option ${1}."
exit 1
fi
NAME="${2}"
# 引数の配列から先頭の2個を削る。
shift
shift
;;
-d|--debug)
# -dまたは--debugオプションはデバッグフラグ。
DEBUG="true"
shift
;;
-*|--*)
# 存在しないオプションについては、エラーで終了。
echo "Can't use the option ${1}."
exit 1
;;
*)
# その他のデフォルトの引数。
# その他のオプション無し引数用の配列に格納する。
OTHER_ARGS[OTHER_ARGS_SIZE]="${1}"
OTHER_ARGS_SIZE="$(expr "${OTHER_ARGS_SIZE}" + "1")"
shift
;;
esac
done
if "${DEBUG}"; then
echo "args = {NAME: ${NAME}, DEBUG: ${DEBUG}, "
echo " OTHER_ARGS: ["
for (( i=0; i<"${OTHER_ARGS_SIZE}"; i++ ))
do
echo " ${OTHER_ARGS[i]},"
done
echo " ]"
echo "}"
fi
echo "Hello, ${NAME}!"
以下のコマンドでrun.sh
を実行します。
chmod 700 run.sh
./run.sh "a0" -d "a1" "a2" --name "Tom" "a3" "a4"
すると以下のとおり結果が出力されます。
args = {NAME: Tom, DEBUG: true,
OTHER_ARGS: [
a0,
a1,
a2,
a3,
a4,
]
}
Hello, Tom!
Discussion