コマンドライン引数の解析

コマンドと引数の解析を示すMS-DOSコマンドライン

コマンドライン引数の解析とは、プログラミング言語コマンドライン引数を解析する ために使用される方法を指します。

コマンドラインオプション

コマンドラインオプション、または単にオプション(フラグまたはスイッチとも呼ばれる)は、コマンドの動作を変更します。その効果はコマンドのプログラムによって決まります。オプションはコマンドライン上でコマンド名の後に、カンマやスペースなどで区切って指定します。区切り文字は必ずしも必要ではありません。例えばDOSのDir/?や は、 DIRコマンドの利用可能なオプションを一覧表示するのとDIR /?同じ効果があります[ 1 ]dir --help 。一方、多くのUnixバージョンでは、オプションの前に少なくとも1つのスペースが必要です(大文字と小文字は区別されます)。

オプションの形式はオペレーティングシステムによって大きく異なります。ほとんどの場合、構文はオペレーティングシステムの要件ではなく慣例によって定められています。コマンドライン全体はプログラムに渡される単なる文字列であり、インタープリタがコマンド名の終わりと引数およびオプションの始まりを判断できる限り、プログラマーはそれを任意の方法で処理できます。

いくつかの規則を説明するために、ディレクトリ内のファイルのリスト表示に関連するコマンドライン オプションの代表的なサンプルをいくつか示します。

オペレーティング·システム指示有効な代替案注記
オープンVMSdirectory/ownerDir /Ownerディレクトリコマンドにファイルの所有権も表示するよう指示します。ディレクトリコマンド名は大文字と小文字を区別せず、一意性を保つために必要な文字数に短縮できます。
ウィンドウズDIR/Q/O:S d*dir /q d* /o:s名前がd(またはD)で始まるファイルの所有権を、サイズが小さい順に表示します。引数d*の前後にはスペースが必要です。
Unix系システムls -lS D*ls -S -l D*名前がD(ただしdは除く)で始まるファイルとディレクトリを、サイズ順(大きい順)に長い形式で表示します。すべての引数とオプションの前後にはスペースが必要ですが、一部の引数とオプションは同時に使用できます。例えば、-lSは-l -Sと同じです。
データジェネラル RDOS CLIlist/e/s 04-26-80/bList /S/E 4-26-80/B1980 年 4 月 26 日より前に作成されたファイルのすべての属性を一覧表示します。日付引数の末尾の /B はローカル スイッチであり、その引数の意味を変更しますが、/S と /E はグローバル スイッチであり、コマンド全体に適用されることに注意してください。
VM/CMS CLILISTFILE (FULLDATE)l(fulリストには、ファイルが最後に書き込まれた日付が含まれます。LISTFILEコマンド名は大文字と小文字が区別されず、一意性を保つために必要な文字数に短縮できます。
OS/360オペレータコマンドSTART TAPERDR,DSNAME=FOO.BARS TAPERDR,DSN=FOO.BAR指定されたデータセット名でTAPERDRという名前のプロシージャを開始します。
TSOLISTCAT LEVEL(FOO) MEMBERSLISTC L(FOO) M指定されたインデックス レベルのデータセットを一覧表示し、各PDSのメンバーを一覧表示します。
SEND 'text' USER(FOO)SE 'text' U(FOO)指定されたユーザーにメッセージを送信する

コマンドライン引数の解析は、プログラムの引数を解析するために使用され、様々な言語で提供されています。例えば、getopt()は引数を解析するための C POSIX ライブラリに含まれています。

解析方法

多くの言語が引数解析機能を提供しています。例えば、C POSIXライブラリはgetopt()を提供し、Pythonは[ 2 ]というモジュールを提供し、C#は[ 3 ]という名前空間を提供しています。他の言語では、これらの機能は標準ライブラリにバンドルされておらず、サードパーティ製のライブラリを介して使用する必要があります。 argparseSystem.CommandLine

多くの言語、特にC言語由来の言語では、引数はメソッドのパラメータを通してアクセスされますmain()。例えば、C言語C++では、mainメソッドのシグネチャはで、は引数の数とプログラム名、はC言語文字列の配列で、 はプログラム名です。JavaとC#では、メソッドは型のパラメータ(文字列の配列)を1つ受け取ります。一方、 Rustなどの他の言語では、コマンドライン引数はメソッド によってアクセスされるため、 から取得する必要はなく、グローバルなアクセスポイントが提供されます。 intmain(intargc,char*argv[]);argcargvargv[0]main()argsString[]std::env::args()main()

さまざまなプログラミング言語

AWK

AWKでも使用されますARGV

BEGIN { for ( i = 0 ; i < ARGC ; i ++ ) { print ARGV [ i ] } }

C

Cはargvコマンドライン引数を処理するために使用します。[ 4 ] [ 5 ]

C引数解析 の例は次のようになります。

#include <stdio.h>int main ( int argc , char * argv []) { for ( int i = 0 ; i < argc ; ++ i ) { printf ( "%s \n " , argv [ count ]); } }

C POSIX ライブラリにgetopt()は、およびと呼ばれる関数もありますgetopt_long()

C++

C++ はC と同じ方法で引数にアクセスします。

stdをインポートしますstd :: stringを使用します。std :: vector使用しますint main ( int argc , char * argv []) { vector < string > args ( argv , argv + argc ); for ( const string & s : args ) { std :: println ( "{}" , s ); } }

POCO C++ライブラリは、Poco::Util::OptionProcessorコマンドライン引数を解析するためのクラスを提供しています。 [ 6 ] Boostはクラスを提供していますboost::program_options::command_line_parser[ 7 ]一方、Googleはと呼ばれるライブラリを提供しています。また、 C++17 +用のライブラリgflagsもあり、Pythonと同様の引数解析APIを提供しています。[ 8 ]argparseargparse

C#

C#引数解析 の例は次のようになります。

クラスReadArgs { static void Main ( string [ ] args ) { foreach ( string arg in args ) { Console.WriteLine ( arg ) ; } } }

C#はSystem.CommandLine高度なコマンドライン引数解析のための名前空間を提供します。[ 9 ]

D

Dプログラミング言語はモジュールを提供しますstd.getopt

行く

Go はflag引数解析用のパッケージを提供します。

ハスケル

Haskell はライブラリを提供しますSystem.Console.GetOpt

ジャワ

Java引数解析 の例は次のようになります。

パブリッククラスReadArgs {パブリック静的void main ( String [ ] args ) { for ( String s : args ) { System.out.println ( s ) ; } } }

Apache Commonsライブラリはorg.apache.commons.cliコマンドライン引数解析機能を提供します。[ 10 ] GNUgnu.getopt getoptから移植されたライブラリもあります。

コトリン

Kotlinで引数を出力する方法はいくつかある: [ 11 ]

fun main ( args : Array < String > ) = println ( args . joinToString ())
fun main ( args : Array < String > ) = println ( args . contentToString ())
fun main ( args : Array < String > ) { for ( arg in args ) { println ( arg ) } }

パール

Perl はを使用します@ARGV

foreach $arg ( @ARGV ) { $argを印刷します; }

または

foreach $argnum ( 0 .. $#ARGV ) { $ARGV [ $argnum ]を印刷します。 }

引数解析用の Getopt::Longandもあります。Getopt::Std

PHP

PHPはargc引数の数として、また引数の値を含む配列argvとして使用します。 [ 12 ] [ 13 ]形式のコマンドライン引数から配列を作成するには、次のようにします。 -foo:bar

$args = parseArgs ( $argv ); echo getArg ( $args , "foo" );関数parseArgs (配列$args ) :配列{ foreach ( $args as $arg ) { $tmp = explode ( ":" , $arg , 2 ); if ( $arg [ 0 ] === "-" ) { $args [ substr ( $tmp [ 0 ], 1 )] = $tmp [ 1 ]; } } return $args ; }関数getArg (配列$args 文字列$arg ) :文字列| bool { if ( isset ( $args [ $arg ] )) { return $args [ $arg ]; } return false ; }

PHPでも使用できますgetopt()[ 14 ]

パイソン

Pythonでは を使用しますsys.argv。例:

インポートシステムif __name__ == "__main__" : for arg in sys . argv : print ( arg )

argparsePythonには、コマンドライン引数を解析するための標準ライブラリにと呼ばれるモジュールもあります。 [ 2 ]

ラケット

Racketはパラメータを使用しcurrent-command-line-arguments、これらの引数を解析するためのracket/cmdline[ 15 ]ライブラリを提供しています。例:

#ラングラケット( racket/cmdlineが必要)(笑顔を定義しますか? (パラメータ#t )) (鼻を定義しますか? (パラメータ#false )) (を定義します(パラメータ":" ))(コマンドライン#:program "emoticon"#:once-any ; 次の 2 つは相互に排他的です[( "-s" "--smile" ) "smile mode" ( smile? #true )] [( "-f" "--frown" ) "frown mode" ( smile? #false )]#:once-each [( "-n" "--nose" ) "鼻を追加する" ( nose? #true )] [( "-e" "--eyes" ) char "目に<char>を使用する" ( eyes char )])( printf "~a~a~a \n " () ( if (鼻? ) "-" "" ) ( if (笑顔? ) ")" " (" ))

ライブラリは、長いフラグと短いフラグを解析し、引数を処理し、短いフラグの組み合わせを許可し、次の処理を-h自動的に行います--help

$ラケット/tmp/c -nfe 8 8-(

レックス

Rexx ではarg、例えば次のように 使用します。

i = 1 をwords ( arg ( 1 ))実行し、 word ( arg ( 1 ), i )を実行します。

さび

main()Rustでは、他のC言語のように引数の一部になるのではなく、引数std::env::args()は にあり、 を返し、によってstd::env::Argsに変換されます。[ 16 ]Vec<String>.collect()

std :: envを使用しますfn main () { let args : Vec < String > = env :: args (). collect ();let query : & String = & args [ 1 ]; let file_path : & String = & args [ 2 ];println! ( "{} を検索しています" , query ); println! ( "ファイル {} 内" , file_path ); }

コマンドライン引数解析用の人気のあるRustライブラリは[ 17 ]clapである。

JavaScript

Node.js

Node.js用に書かれたJavaScriptプログラムはグローバル変数を使用しますprocess.argv[ 18 ]

// argv.js console.log ( process.argv ) ;
$ node argv.js 1 2 3 4 5 [ 'node' , '/home/avian/argvdemo/argv.js' , '1' , '2' , '3' , '4' , '5' ]

Node.jsプログラムは、指定されたファイルを使ってインタープリタnode interpreterを実行することで呼び出されます。そのため、最初の2つの引数はnodeとJavaScriptソースファイルの名前になります。残りの引数は から部分配列をスライスすることで抽出することがしばしば有用ですprocess.argv[ 19 ]

// process - args.js console.log ( process.argv.slice ( 2 ) ) ;
$ node process-args.js 1 2 = 3 4 [ '1' , '2=3' , '4' ]

パン

Bunの使用Bun.argvとその機能のために書かれたJavaScript util.parseArgs[ 20 ]

console.log ( Bun.argv ) ;

デノ

Denoで使用するために書かれたJavaScript Deno.args[ 21 ]parseArgs関数。[ 22 ]

コンソールログ( Deno . args );

参考文献

  1. ^ポール、マティアス R. (1997-07-30)。「NWDOS-TIP – Novell DOS 7 に関するヒントとコツ、Blick の詳細、バグと回避策」MPDOSTIP。リリース 157 (ドイツ語) (第 3 版)。2017-09-10 のオリジナルからアーカイブ2014 年 9 月 6 日に取得(注: NWDOSTIP.TXT はNovell DOS 7およびOpenDOS 7.01に関する包括的な作業であり、多くの文書化されていない機能と内部構造の説明が含まれています。これは、2001 年まで維持され、当時多くのサイトで配布されていた、著者がさらに大規模に管理していた MPDOSTIP.ZIP コレクションの一部です。提供されているリンクは、HTML に変換された NWDOSTIP.TXT ファイルの古いバージョンを指しています。)
  2. ^ a b「argparse — コマンドラインオプション、引数、サブコマンドのパーサー」。Python v3.10.0 ドキュメント2012年11月1日時点のオリジナルよりアーカイブ2021年10月15日閲覧。
  3. ^ Microsoft Corporation. 「System.CommandLine の概要」 . learn.microsoft.com . Microsoft Learn . 2025年12月6日閲覧
  4. ^ 「Cブック - mainへの引数」 . Publications.gbdirect.co.uk . 2010年5月31日閲覧。
  5. ^ Cの引数とオプションの解析例
  6. ^ POCOプロジェクト。「クラスPoco::Util::OptionProcessor」。docs.pocoproject.org。POCO C++ライブラリ。 2025年12月6日閲覧
  7. ^ Vladimir Prus. 「第28章 Boost.Program_options」 . boost.org/doc . Boost C++ ライブラリ. 2025年12月6日閲覧
  8. ^ p-ranav. "argparse" . github.com . GitHub . 2025年12月6日閲覧
  9. ^ 「System.CommandLine の概要 - .NET」 . learn.microsoft.com . 2025年12月6日閲覧
  10. ^ Apache Commons (2025年11月8日). 「Apache Commons CLI」 . commons.apache.org . Apache Commons.
  11. ^ 「Kotlin: 基本構文」 。 2022年5月13日閲覧
  12. ^ 「PHPマニュアル」 . PHP . 2010年5月31日閲覧
  13. ^ウィキブック:PHP プログラミング/CLI
  14. ^ 「PHP: Getopt - マニュアル」
  15. ^ Racketリファレンスマニュアル、コマンドライン解析
  16. ^ 「コマンドライン引数の受け入れ - Rustプログラミング言語」 . doc.rust-lang.org . 2022年12月22日閲覧
  17. ^ 「Crate clap」 . docs.rs. clap. 2025年11月19日.
  18. ^ "process.argv" . Node.js v10.16.3 ドキュメント. 2019年10月3日閲覧
  19. ^ 「コマンドライン引数を解析する方法」。Node.js Foundationドキュメント2020年3月17日時点のオリジナルよりアーカイブ。 2019年10月3日閲覧
  20. ^ 「コマンドライン引数を解析する | Bun の例」 . Bun .
  21. ^ "Deno.args" . docs.deno.com
  22. ^ 「parse-args の parseArgs - @std/cli - JSR. jsr.io.