📖

bashの引数処理の例

2024/04/04に公開

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