#概要
いつもはちょっとした処理を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を使うと便利だと感じました。