各言語でコマンドライン引数を扱う
そういえばやってなかったなということで、各言語でコマンドライン引数を扱うプログラムを書いてみたメモ。
要件は以下の通り。
- コマンドライン引数として、3個以上の文字列を与える
- 標準出力に、以下を順に出力
- 引数として与えられた文字列を改行区切りで出力
- 引数の個数を出力
- 引数の3番目の文字列を出力
環境
手元にあるものということで、環境は以下のものに限定する。
- CentOS 7
実行例
[各言語でのコマンド実行] a b c d e
出力例
a b c d e 5 c
Java
public class Main { public static void main(String[] args) { for (String s : args) { System.out.println(s); } System.out.println(args.length); System.out.println(args[2]); } }
C
#include <stdio.h> int main(int argc, char** argv) { for (int i = 1; i < argc; ++i) { printf("%s\n", argv[i]); } printf("%d\n", argc - 1); printf("%s\n", argv[3]); return 0; }
C++
#include <iostream> using namespace std; int main(int argc, char** argv) { for (int i = 1; i < argc; ++i) { cout << argv[i] << endl; } cout << (argc - 1) << endl; cout << argv[3] << endl; return EXIT_SUCCESS; }
PHP
<?php for ($i = 1; $i < count($argv); ++$i) { echo $argv[$i] . PHP_EOL; } echo (count($argv) - 1) . PHP_EOL; echo $argv[3] . PHP_EOL;
Python 2
import sys for i in range(1, len(sys.argv)): print sys.argv[i] print len(sys.argv) - 1 print sys.argv[3]
Python 3
import sys for i in range(1, len(sys.argv)): print(sys.argv[i]) print(len(sys.argv) - 1) print(sys.argv[3])
Ruby
for a in ARGV print a,"\n" end print ARGV.length,"\n" print ARGV[2],"\n"
Perl
for (my $i = 0; $i < @ARGV; ++$i) { print $ARGV[$i],"\n"; } my $argc = @ARGV; print $argc,"\n"; print $ARGV[2],"\n";
Go
package main import ( "fmt" "os" ) func main() { for i := 1; i < len(os.Args); i += 1 { fmt.Println(os.Args[i]) } fmt.Println(len(os.Args) - 1) fmt.Println(os.Args[3]); }
bash
#! /bin/bash for c in "$@" ; do echo ${c} done echo $# echo $3
まとめ
それぞれの言語ごとの仕様を表にまとめてみる。
言語 | 変数名 | 最初の引数の添え字 | 個数 |
---|---|---|---|
Java (*1) | args | 0 | args.length |
C (*1) | argv | 1 | argc - 1 |
C++ (*1) | argv | 1 | argc - 1 |
PHP | $argv | 1 | count($argv) - 1 |
Python 2/3 | sys.argv | 1 | len(sys.argv) - 1 |
Ruby | ARGV | 0 | ARGV.length |
Perl | $ARGV | 0 | @ARGV (*3) |
Go | os.Args | 1 | len(os.Args) - 1 |
bash | $n または ${n} (*2) | 1 | $# |
- (*1)変数名はmainメソッド/関数の引数の宣言による。
- (*2)「n」は正の整数。
- (*3)文脈によっては、「my $argc = @ARGV」などとしてやらないと、個数でなく引数を結合した文字列が得られてしまう。