C Academy · レッスン

CLI ツールの作成

実践的な例を扱います。

レッスン 4/413 ステップ

「CLI ツールの作成」はCoddyKit上の無料C Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。

全体を組み合わせる

ここでは、引数、オプション、解析を組み合わせて、小さいながらも完全なCLI ツールを作成します。

例として、値といくつかのオプションを読み取り、結果を出力する数値フォーマットユーティリティを作ります。

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("Usage: %s <number>\n", argv[0]);
        return 1;
    }
    printf("You passed: %s\n", argv[1]);
    return 0;
}

インターフェースを設計する

優れた CLI ツールは、最初にインターフェースを定義します。このツールでは次を受け付けます。

  • -v 詳細な出力
  • -r N 出力を N 回繰り返す
  • 1 つの位置引数: 出力するテキスト
#include <stdio.h>

int main(void) {
    printf("Interface: prog [-v] [-r N] <text>\n");
    return 0;
}

設定を宣言する

設定可能な各動作を、適切なデフォルト値を持つ変数で管理します。これにより、解析と実際の処理を分離できます。

#include <stdio.h>

int main(void) {
    int verbose = 0;
    int repeat = 1;
    const char *text = NULL;
    printf("defaults: verbose=%d repeat=%d\n", verbose, repeat);
    return 0;
}

getopt で解析する

getopt を使ってフラグを設定します。-r は値を取るため、optstring の項目は r: です。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    int verbose = 0, repeat = 1, opt;
    while ((opt = getopt(argc, argv, "vr:")) != -1) {
        if (opt == 'v') verbose = 1;
        else if (opt == 'r') repeat = atoi(optarg);
    }
    printf("verbose=%d repeat=%d\n", verbose, repeat);
    return 0;
}

位置引数を読み取る

getopt の処理後、optind は最初のオプションではない引数を指します。そこからテキストを取得します。

存在しない場合は使用方法を出力し、エラーコードで終了します。

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    while (getopt(argc, argv, "vr:") != -1) { }
    if (optind >= argc) {
        printf("Error: missing text argument\n");
        return 1;
    }
    printf("text = %s\n", argv[optind]);
    return 0;
}

数値入力を検証する

堅牢なツールでは、-r に適切な数値が渡されたことを確認します。0 以下の繰り返し回数は拒否してください。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    int repeat = 1, opt;
    while ((opt = getopt(argc, argv, "r:")) != -1) {
        if (opt == 'r') repeat = atoi(optarg);
    }
    if (repeat < 1) {
        printf("Error: repeat must be >= 1\n");
        return 1;
    }
    printf("repeat = %d\n", repeat);
    return 0;
}

処理を実行する

設定の解析と検証が完了したら、実際の処理を行います。ここでは、テキストを repeat 回出力します。

#include <stdio.h>

int main(void) {
    const char *text = "hello";
    int repeat = 3;
    for (int i = 0; i < repeat; i++) {
        printf("%s\n", text);
    }
    return 0;
}

詳細な出力

詳細フラグを使うと、診断情報を追加できます。通常の出力をすっきり保つため、そのような出力はフラグが設定されている場合だけ行います。

#include <stdio.h>

int main(void) {
    int verbose = 1;
    const char *text = "hi";
    if (verbose) printf("[debug] about to print text\n");
    printf("%s\n", text);
    return 0;
}

完全なツール

ここでは、すべての要素をまとめた完全なプログラムを示します。解析、検証、そして実行という流れです。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    int verbose = 0, repeat = 1, opt;
    while ((opt = getopt(argc, argv, "vr:")) != -1) {
        if (opt == 'v') verbose = 1;
        else if (opt == 'r') repeat = atoi(optarg);
    }
    if (optind >= argc) { printf("Usage: prog [-v] [-r N] <text>\n"); return 1; }
    const char *text = argv[optind];
    if (verbose) printf("[debug] repeat=%d\n", repeat);
    for (int i = 0; i < repeat; i++) printf("%s\n", text);
    return 0;
}

終了コードは重要

CLI ツールは終了コードによって成功を伝えます。成功時には 0、エラー時にはゼロ以外を返します。

スクリプトやほかのプログラムは、この値に基づいて次の処理を決定します。

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("failure\n");
        return 2;
    }
    printf("success\n");
    return 0;
}

エラーを stderr に出力する

慣例では、通常の出力は stdout に、エラーは fprintf(stderr, ...) を使って stderr に出力します。

これにより、出力をリダイレクトしたときに結果と診断情報を分離できます。

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        fprintf(stderr, "Error: need an argument\n");
        return 1;
    }
    printf("%s\n", argv[1]);
    return 0;
}

理解度チェック

CLI ツールの慣例についての理解度を確認しましょう。

まとめ

完全な CLI ツールを作成しました。

  • インターフェースを定義し、デフォルト値付きで設定を宣言します。
  • getopt でフラグを解析し、optind から位置引数を読み取ります。
  • 処理を行う前に入力を検証します。
  • 意味のある終了コードを返し、エラーを stderr に送ります。
無料で開始

AI チューターと学ぶ C — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
39
レッスン
144

よくある質問

「CLI ツールの作成」レッスンは無料ですか?

はい。「CLI ツールの作成」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。

「CLI ツールの作成」で何を学びますか?

実践的な例を扱います。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「CLI ツールの作成」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC Academyレッスンでコードを書いて実行できますか?

はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. argc と argv
  2. オプションの解析
  3. getopt
  4. CLI ツールの作成
← C Academyに戻る