search
LoginSignup
2

More than 1 year has passed since last update.

posted at

updated at

Organization

TypeScriptでコマンドライン引数を取り扱う

概要

いつもはちょっとした処理をShellScriptで書きがちだったのですが、TypeScriptで書いてみたところ、コマンドライン引数の取り扱いが綺麗にできたので、備忘録として残しておきます。

ShellScriptでのコマンドライン引数

Shellでコマンドライン引数をパースして、必須引数の存在チェックや説明メッセージを追加したい場合、色々書き方はあるかと思いますが、下記の様な感じになります。

script.sh
#!/usr/bin/env bash
set -e

function usage() {
    cat <<EOS
  Usage: $0
  [REQUIRED]
    --account         : AWS account to deploy.
    --stage           : Stage name of the resource to deploy.
  [OPTIONS]
    --params          : Parameters required for deployment.
EOS
    exit 1
}

ARGS=($@)
for ((i = 0; i < ${#ARGS[@]}; i++)); do
    case "${ARGS[$i]}" in
    "--account")
        i=$(expr $i + 1)
        ACCOUNT="${ARGS[$i]}"
        ;;
    "--stage")
        i=$(expr $i + 1)
       STAGE="${ARGS[$i]}"
        ;;
    "--params")
        i=$(expr $i + 1)
       PARAMS="${ARGS[$i]}"
        ;;
    *)
        usage
        ;;
    esac
done

if [ -z "${ACCOUNT}" -o -z "${STAGE}" ]; then
    usage
fi

TypeScriptでのコマンドライン引数

上と同じ様なものをTypeScriptで作成しようとした場合、yargsを利用するとこんな感じで簡単に実現できます。

script.ts
import * as yargs from "yargs";

const argv = yargs
  .option("account", {
    description: "AWS account to deploy.",
    demandOption: true,
  })
  .option("stage", {
    description: "Stage name of the resource to deploy.",
    demandOption: true,
  })
  .option("params", {
    description: "Parameters required for deployment.",
    demandOption: false,
  })
  .help().argv;

console.log(argv);
console.log(`${argv.account}`);
console.log(`${argv.stage}`);
console.log(`${argv.params}`);

以下の例では、引数を全て入力してスクリプトを実行しています。

> ts-node script.ts --account DEV --stage dev --params test 
{
  _: [],
  account: 'DEV',
  stage: 'dev',
  params: 'test',
  '$0': 'script.ts'
}
DEV
dev
test

以下の例では、引数が不足している状態でスクリプトを実行しています。
説明メッセージを綺麗に表示してくれます。

> ts-node script.ts
オプション:
  --version  バージョンを表示                                             [真偽]
  --account  AWS account to deploy.                                   [必須]
  --stage    Stage name of the resource to deploy.                    [必須]
  --params   Parameters required for deployment.
  --help     ヘルプを表示                                                [真偽]

必須の引数が見つかりません: account, stage

まとめ

TypeScriptを利用するプロジェクトでちょっとしたスクリプトを作る際は、ShellScriptよりもTypeScript × yargsを使うと便利だと感じました。

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
What you can do with signing up
2