
コマンドライン引数の解析とは、プログラミング言語でコマンドライン引数を解析する ために使用される方法を指します。
コマンドラインオプション、または単にオプション(フラグまたはスイッチとも呼ばれる)は、コマンドの動作を変更します。その効果はコマンドのプログラムによって決まります。オプションはコマンドライン上でコマンド名の後に、カンマやスペースなどで区切って指定します。区切り文字は必ずしも必要ではありません。例えばDOSのDir/?や は、 DIRコマンドの利用可能なオプションを一覧表示するのとDIR /?同じ効果があります[ 1 ]dir --help 。一方、多くのUnixバージョンでは、オプションの前に少なくとも1つのスペースが必要です(大文字と小文字は区別されます)。
オプションの形式はオペレーティングシステムによって大きく異なります。ほとんどの場合、構文はオペレーティングシステムの要件ではなく慣例によって定められています。コマンドライン全体はプログラムに渡される単なる文字列であり、インタープリタがコマンド名の終わりと引数およびオプションの始まりを判断できる限り、プログラマーはそれを任意の方法で処理できます。
いくつかの規則を説明するために、ディレクトリ内のファイルのリスト表示に関連するコマンドライン オプションの代表的なサンプルをいくつか示します。
| オペレーティング·システム | 指示 | 有効な代替案 | 注記 |
|---|---|---|---|
| オープンVMS | directory/owner | Dir /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 CLI | list/e/s 04-26-80/b | List /S/E 4-26-80/B | 1980 年 4 月 26 日より前に作成されたファイルのすべての属性を一覧表示します。日付引数の末尾の /B はローカル スイッチであり、その引数の意味を変更しますが、/S と /E はグローバル スイッチであり、コマンド全体に適用されることに注意してください。 |
| VM/CMS CLI | LISTFILE (FULLDATE) | l(ful | リストには、ファイルが最後に書き込まれた日付が含まれます。LISTFILEコマンド名は大文字と小文字が区別されず、一意性を保つために必要な文字数に短縮できます。 |
| OS/360オペレータコマンド | START TAPERDR,DSNAME=FOO.BAR | S TAPERDR,DSN=FOO.BAR | 指定されたデータセット名でTAPERDRという名前のプロシージャを開始します。 |
| TSO | LISTCAT LEVEL(FOO) MEMBERS | LISTC 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でも使用されますARGV。
BEGIN { for ( i = 0 ; i < ARGC ; i ++ ) { print ARGV [ i ] } }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 と同じ方法で引数にアクセスします。
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#引数解析 の例は次のようになります。
クラスReadArgs { static void Main ( string [ ] args ) { foreach ( string arg in args ) { Console.WriteLine ( arg ) ; } } }C#はSystem.CommandLine高度なコマンドライン引数解析のための名前空間を提供します。[ 9 ]
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は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である。
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 );