コマンドライン引数を取得する

コマンドライン引数を取得する。

まずはパッケージを作成する。

$ cargo new hello-command-line
  1. 標準ライブラリを使ってコマンドライン引数を取得する
  2. Clapを使ってコマンドライン引数をパースする
標準ライブラリを使ってコマンドライン引数を取得する

コマンドライン引数の取得は標準ライブラリのenvを使えば簡単にできる。

use std::env;

fn main() {
    // へぇー、main関数の引数じゃないんだね
    let args: Vec = env::args().collect();
    println!("{:?}", args);
}

このコードを試してみるには、cargo runコマンドに引数(ただし、-の付いた引数はcargoコマンド側が解釈してしまうので不可)を渡せば、実行モジュールに引数が渡される。因みにインデックス0はプログラム名となっているので、コマンドライン引数はインデックス1からとなる。

$ cargo run test 123
["target/debug/hello-command-line", "test", "123"]

もちろん、cargoコマンドは使わずに、生成されたバイナリを直接起動することもできる。デバッグビルドのバイナリはtarget/debugディレクトリ、リリースビルドのバイナリはtarget/releaseディレクトリに生成されているはずだ。

$ ./hello-command-line test 123
["./hello-command-line", "test", "123"]
Clapを使ってコマンドライン引数をパースする

簡単なコマンドライン引数なら標準ライブラリだけで問題はないが、オプション引数も設けたいならClapが便利だ。Clapは多機能なコマンドラインパーサーで、各種のコマンドライン引数のパースはもちろん、ヘルプ等も生成できる。

Clapを使うにはCargo.tomlに依存関係を追加する。

[dependencies]
clap = "2"

そして、以下のコードを書くだけで--helpオプションと--versionオプションが用意される。

use clap::App;

fn main() {
    App::new("コマンドライン引数サンプル")
        .version("1.0.0")
        .get_matches();
}

cargoコマンドにも--helpオプションが存在するために、このコードはcargo buildコマンドでビルドして、生成されたバイナリを直接実行しよう。リリースビルドにしたい場合は--releaseオプションを指定しても良い。

$ cargo build --release

バイナリのあるディレクトリに移動し、以下のコマンドを実行してみる。

$ ./hello-command-line --version
コマンドライン引数サンプル 1.0.0
$ ./hello-command-line --help
コマンドライン引数サンプル 1.0.0

USAGE:
    hello-command-line

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

例えば、オプションでなく処理に必要なファイル名等の引数はarg()で追加する。これらファイル名やオプションは、get_matches()の戻り値ArgMatchesからvalue_of()等で取得できる。

また、--helpオプションで表示される--helpオプション、及び--versionオプションの説明は、それぞれhelp_message()、version_message()で変更できる。

use clap::{App, Arg};

fn main() {
    let matches = App::new("コマンドライン引数サンプル")
        .version("1.0.0")
        .version_message("バージョンを表示する")
        .help_message("ヘルプを表示する")
        .arg(Arg::with_name("INPUT").help("ファイル名"))
        .get_matches();

    if let Some(input) = matches.value_of("INPUT") {
        println!("ファイル名は{}です。", input);
    } else {
        println!("ファイル名が指定されていません。");
    }
}
$ ./hello-command-line --help
コマンドライン引数サンプル 1.0.0

USAGE:
    hello-command-line [INPUT]

FLAGS:
    -h, --help       ヘルプを表示する
    -V, --version    バージョンを表示する

ARGS:
    <INPUT>    ファイル名
$ ./hello-command-line sample.txt
ファイル名はsample.txtです。
$ ./hello-command-line
ファイル名が指定されていません。

この他にも、Clapには様々な機能が用意されているので、ドキュメントを参照して活用していただきたい。

(2021/01/20)

新着情報
【Rust Tips】Actix webでJSONをPOSTする
【Rust Tips】コマンドライン引数を取得する
【Rust Tips】現在日時を取得する

Copyright© 2004-2021 モバイル開発系(K) All rights reserved.
[Home]