Command-line arguments
Retrieve the list of command-line arguments given to the program.
![Task](http://static.miraheze.org/rosettacodewiki/thumb/b/ba/Rcode-button-task-crushed.png/64px-Rcode-button-task-crushed.png)
You are encouraged to solve this task according to the task description, using any language you may know.
Example command line:
myprogram -c "alpha beta" -h "gamma"
Ada
Command line arguments are available through the predefined package Ada.Command_Line.
<lang ada>with Ada.Command_line; use Ada.Command_Line; with Ada.Text_IO; use Ada.Text_IO
procedure Print_Commands is begin
-- The number of command line arguments is retrieved from the function Argument_Count -- The actual arguments are retrieved from the function Argument -- The program name is retrieved from the function Command_Name Put(Command_Name & " "); for Arg in 1..Argument_Count loop Put(Argument(Arg) & " "); end loop; New_Line;
end Print_Commands;</lang>
ALGOL 68
<lang algol68>main:(
FOR i TO argc DO printf(($"the argument #"g(-0)" is "gl$, i, argv(i))) OD
)</lang> Output:
the argument #1 is a68g the argument #2 is Command_Line_Arguments.a68
AutoHotkey
From the AutoHotkey documentation: "The script sees incoming parameters as the variables %1%, %2%, and so on. In addition, %0% contains the number of parameters passed (0 if none). " <lang autohotkey>Loop %0% ; number of parameters
params .= %A_Index% . A_Space
If params !=
MsgBox, %0% parameters were passed:`n`n %params%
Else
Run, %A_AhkPath% "%A_ScriptFullPath%" -c "\"alpha beta\"" -h "\"gamma\""</lang>
BASIC
For most older BASICs that supply the keyword COMMAND$
, all arguments are returned in a single string that must then be parsed inside the program. (Unlike modern BASICs, there is often no easy way to retreive the program's name.)
<lang qbasic>PRINT "args: '"; COMMAND$; "'"</lang>
Sample output:
args: 'This is a test.'
FreeBASIC supplies three ways to retreive the arguments: COMMAND$
(which emulates the standard QuickBASIC COMMAND$
), COMMAND$()
(which works like C's argv[]
), and __FB_ARGV__
(which works similar to C's argv[]
, but is an array of pointers).
<lang freebasic>DIM i AS INTEGER
PRINT COMMAND$
PRINT "This program is named "; COMMAND$(0) i = 1 DO WHILE(LEN(COMMAND$(i)))
PRINT "The argument "; i; " is "; COMMAND$(i) i = i + 1
LOOP
FOR i = 0 TO __FB_ARGC__ - 1
PRINT "arg "; i; " = '"; *__FB_ARGV__[i]; "'"
NEXT i</lang>
Sample output:
C:\>cla 1 2 3 1 2 3 This program is named cla The argument 1 is 1 The argument 2 is 2 The argument 3 is 3 arg 0 = 'cla' arg 1 = '1' arg 2 = '2' arg 3 = '3'
See also: RapidQ
C
Command line arguments are passed to main. Since the program name is also passed as "argument", the provided count is actually one more than the number of program arguments. Traditionally the argument count is named argc and the array of argument strings is called argv, but that's not mandatory; any (non-reserved) name will work just as well. It is, however, a good idea to stick to the conventional names.
Be careful on systems that use Unicode or other multibyte character sets. You may need to use a type of _wchar* and multi-byte-character-set-aware versions of printf.
<lang c>#include <stdio.h>
int main(int argc, char* argv[]) {
int i; printf("This program is named %s.\n", argv[0]); for (i = 1; i < argc; ++i) printf("the argument #%d is %s\n", i, argv[i]);
return 0;
}</lang>
C++
Command line arguments are passed the same way as in C.
This example uses iostream. Traditional C I/O also works.
<lang cpp>#include <iostream>
int main(int argc, char* argv[]) {
std::cout << "This program is named " << argv[0] << std::endl; std::cout << "There are " << argc-1 << " arguments given." << std::endl; for (int i = 1; i < argc; ++i) std::cout << "the argument #" << i << " is " << argv[i] << std::endl;
return 0;
}</lang>
C#
There are at least two methods to access the command-line arguments. The first method is to access the string array passed to Main. This method only accesses the arguments and not the path to the executable. <lang csharp>using System;
namespace RosettaCode {
class Program { static void Main(string[] args) { for (int i = 0; i < args.Length; i++) Console.WriteLine(String.Format("Argument {0} is '{1}'", i, args[i])); } }
}</lang>
The second method is to call the Environment.GetCommandLineArgs function. This method also returns the path to the executable as args[0] followed by the actual command line arguments. <lang csharp>using System;
namespace RosettaCode {
class Program { static void Main() { string[] args = Environment.GetCommandLineArgs(); for (int i = 0; i < args.Length; i++) Console.WriteLine(String.Format("Argument {0} is '{1}'", i, args[i])); } }
}</lang>
Common Lisp
The Common Lisp standard does not specify anything relating to external invocation of a Common Lisp system. The method for getting command-line arguments varies by implementation; here are some examples:
Implementation | Expression | Includes program name (argv[0]) |
---|---|---|
SBCL | sb-ext:*posix-argv* | Yes |
CLISP | ext:*args* | No |
All of these return a list of strings.
Clean
getCommandLine from the module ArgEnv returns an array of command-line arguments (the first element is the name of the program).
<lang clean>import ArgEnv
Start = getCommandLine</lang>
D
<lang d>import std.stdio ;
void main(string[] args) {
foreach(i, e ; args[1..$]) writefln("#%2d : %s", i + 1, e) ;
}</lang>
DOS Batch File
<lang dos>@echo off setlocal enabledelayedexpansion
set Count=0
- loop
if not "%1"=="" (
set /a count+=1 set parameter[!count!]=%1 shift goto loop
)
for /l %%a in (1,1,%count%) do (
echo !parameter[%%a]!
)</lang>
E
<lang e>interp.getArgs()</lang>
Erlang
<lang erlang>3> init:get_arguments().</lang> result <lang erlang>[{root,["/usr/erlang/erl5.5"]}, {progname,["erl"]}, {home,["/home/me"]}, {c,["alpha beta"]}, {h,["gamma"]}]</lang>
init:get_argument(name) can be used to fetch value of a particular flag
<lang erlang>4> init:get_argument(h). {ok,"gamma"} 5> init:get_argument(c). {ok,"alpha beta"}</lang>
Forth
Access to command line arguments is not a standard feature of Forth, since it is designed to be used without an operating system. The popular GNU implementation gforth runs from a shell and can access command line arguments similar to C: variable argc contains the count (including the command itself) and arg is a function that returns the nth argument as a string.
<lang forth>\ args.f: print each command line argument on a separate line
- main
argc @ 0 do i arg type cr loop ;
main bye</lang>
Here is output from a sample run. <lang forth>$ gforth args.f alpha "beta gamma" delta gforth args.f alpha beta gamma delta $</lang>
F#
The entry-point function accepts the comment line arguments as an array of strings. The following program will print each argument on a separate line. <lang fsharp>#light [<EntryPoint>] let main args =
Array.iter (fun x -> printfn "%s" x) args 0</lang>
Groovy
Command-line arguments are accessible via the args list variable. The following is saved as the file "Echo.groovy": <lang groovy>println args</lang>
The existence of command-line arguments presupposes the existence of a command line interpreter. The following test runs were entered in a cygwin bash shell in a Microsoft Windows XP system:
$ groovy Echo this is an argument list [this, is, an, argument, list] $ groovy Echo -x alkfrew4oij -cdkjei +22 [-x, alkfrew4oij, -cdkjei, +22] $
For more sophisticated command-line option and option-argument parsing use the CliBuilder (command-line interface builder) librar, which extends the functionality of the Java-based Apache Commons CLI library to Groovy.
Haskell
Defined by the System module, getArgs :: IO [String] provides the command-line arguments in a list.
myprog.hs: <lang haskell>import System main = getArgs >>= print</lang>
myprog a -h b c => ["a","-h","b","c"]
J
The global ARGV
holds the command line arguments.
Java
<lang java>public class Arguments {
public static void main(String[] args) { System.out.println("There are " + args.length + " arguments given."); for(int i = 0; i < args.length; i++) System.out.println("The argument #" + (i+1) + " is " + args[i] + "and is at index " + i); }
}</lang>
For more sophisticated command-line option and option-argument parsing use the Apache Commons CLI (command-line interface) library.
JavaScript
<lang javascript>var objArgs = WScript.Arguments; for (var i = 0; i < objArgs.length; i++)
WScript.Echo(objArgs.Item(i));</lang>
<lang javascript>for (var i = 0; i < arguments.length; i++)
print(arguments[i]);</lang>
Logo
If the command line to a logo script is written
logo file.logo - arg1 arg2 arg3
Then the arguments after the "-" are found in a list in variable :COMMAND.LINE <lang logo>show :COMMAND.LINE [arg1 arg2 arg3]</lang> Alternatively, make the first line of an executable logo script:
#! /usr/bin/logo -
to be able to invoke the script with arguments.
file.logo arg1 arg2 arg3
LSE64
<lang lse64>argc , nl # number of arguments (including command itself) 0 # argument dup arg dup 0 = || ,t 1 + repeat drop</lang>
Modula-3
Command line parameters are accessed using the Params module. <lang modula3>MODULE Args EXPORTS Main;
IMPORT IO, Params;
BEGIN
IO.Put(Params.Get(0) & "\n"); IF Params.Count > 1 THEN FOR i := 1 TO Params.Count - 1 DO IO.Put(Params.Get(i) & "\n"); END; END;
END Args.</lang>
Output:
martin@thinkpad:~$ ./prog ./prog martin@thinkpad:~$ ./prog 10 ./prog 10 martin@thinkpad:~$ ./prog 10 20 ./prog 10 20
Objective-C
In addition to the regular C mechanism of arguments to main(), Objective-C also has another way to get the arguments as string objects inside an array object: <lang objc>NSArray *args = [[NSProcessInfo processInfo] arguments]; NSLog(@"This program is named %@.", [args objectAtIndex:0]); NSLog(@"There are %d arguments.", [args count] - 1); for (i = 1; i < [args count]; ++i)
NSLog("the argument #%d is %@", i, [args objectAtIndex:i]);
}</lang>
OCaml
The program name is also passed as "argument", so the array length is actually one more than the number of program arguments.
<lang ocaml>let () =
Printf.printf "This program is named %s.\n" Sys.argv.(0); for i = 1 to Array.length Sys.argv - 1 do Printf.printf "the argument #%d is %s\n" i Sys.argv.(i) done</lang>
Using the Arg module
<lang ocaml>(* default values *) let somebool = ref false let somestr = ref "" let someint = ref 0
let usage = "usage: " ^ Sys.argv.(0) ^ " [-b] [-s string] [-d int]"
let speclist = [
("-b", Arg.Unit (fun () -> somebool := true), ": set somebool to true"); ("-s", Arg.String (fun s -> somestr := s), ": what follows -s sets some string"); ("-d", Arg.Int (fun d -> someint := d), ": some int parameter"); ]
let () =
(* Read the arguments *) Arg.parse speclist (fun x -> raise (Arg.Bad ("Bad argument : " ^ x))) usage;
Printf.printf " %b %d '%s'\n" !somebool !someint !somestr;
- </lang>
% ocaml arg.ml --help usage: tmp.ml [-b] [-s string] [-d int] -b : set somebool to true -s : what follows -s sets some string -d : some int parameter --help Display this list of options % ocaml arg.ml -d 4 -b -s blabla true 4 'blabla' % ocaml arg.ml false 0 ''
Perl
@ARGV is the array containing all command line parameters
<lang perl>my @params = @ARGV; my $second = $ARGV[1]; my $fifth = $ARGV[4];</lang>
Perl 6
Perl 5's @ARGV
is available as @*ARGS
. Alternatively, if you define a subroutine named MAIN
, Perl will automatically process @*ARGS
according to Unix conventions and MAIN
's signature (or signatures, if your MAIN
is a multi sub) and then call MAIN
with appropriate arguments; see Synopsis 6.
PHP
When PHP is run from the command line, the special variables $argv and $argc contain the array of arguments, and the number of arguments, respectively. The program name is passed as the first argument.
<lang php><?php $program_name = $argv[0]; $second_arg = $argv[2]; ?></lang>
Pop11
variable poparglist contains list of command line arguments (as strings). One can use iteration over list to process then (for example print).
<lang pop11>lvars arg; for arg in poparglist do
printf(arg, '->%s<-\n');
endfor;</lang>
PowerShell
In PowerShell the arguments to a script can be accessed with the $args
array:
<lang powershell>$i = 0
foreach ($s in $args) {
Write-Host Argument (++$i) is $s
}</lang>
Python
sys.argv is a list containing all command line arguments, including the program name. Typically you slice the list to access the actual command line argument:
<lang python>import sys program_name = sys.argv[0] arguments = sys.argv[1:] count = len(arguments)</lang>
When running a module by invoking Python, the Python interpreter processes and removes some of the arguments, and the module cannot access them. To process command line arguments, run the module directly. sys.argv is a copy of the command line arguments; modifying sys.argv will not change the arguments seen by other processes, e.g. ps. (In other words sys.argv is an object which contains a copy of the process' command line arguments ... modifying that copy is only visible from within the Python program and not externally).
R
Since you do not create executables using R, the task is not directly appropriate. It is however possible to determine the list of arguments supplied when the R session was invoked. <lang R>commandArgs(TRUE)</lang>
RapidQ
<lang rapidq>PRINT "This program is named "; Command$(0) FOR i=1 TO CommandCount
PRINT "The argument "; i; " is "; Command$(i)
NEXT i</lang>
Raven
<lang raven>ARGS print
stack (6 items)
0 => "raven" 1 => "myprogram" 2 => "-c" 3 => "alpha beta" 4 => "-h" 5 => "gamma"</lang>
Ruby
Command line arguments are available in the constant Object::ARGV.
myprog: <lang ruby>#! /usr/bin/env ruby p ARGV</lang>
myprog a -h b c => ["a","-h","b","c"]
Scheme
COMMAND-LINE-ARGUMENTS returns a list of the arguments. <lang scheme>$ csi -e "(display (command-line-arguments)) (newline)" (-e (display (command-line-arguments)) (newline))</lang>
Seed7
<lang seed7>$ include "seed7_05.s7i";
const proc: main is func
local var integer: i is 0; begin writeln("This program is named " <& name(PROGRAM) <& "."); for i range 1 to length(argv(PROGRAM)) do writeln("The argument #" <& i <& " is " <& argv(PROGRAM)[i]); end for; end func;</lang>
Slate
<lang slate>StartupArguments do: [| :arg | inform: arg]</lang>
Smalltalk
<lang smalltalk>(1 to: Smalltalk getArgc) do: [ :i |
(Smalltalk getArgv: i) displayNl
]</lang>
Standard ML
<lang sml>print ("This program is named " ^ CommandLine.name () ^ ".\n"); val args = CommandLine.arguments (); Array.appi
(fn (i, x) => print ("the argument #" ^ Int.toString (i+1) ^ " is " ^ x ^ "\n")) (Array.fromList args);</lang>
Tcl
The predefined variable argc contains the number of arguments passed to the routine, argv contains the arguments as a list. Retrieving the second argument might look something like this:
<lang tcl>if { $argc > 1 } {
puts [lindex $argv 1]
}</lang>
(Tcl counts from zero, thus [lindex $list 1] retrieves the second item in the list)
Toka
Arguments are stored into an array. The first element in the array is the name of the program, the rest are the arguments in order. The number of arguments is provided by #args.
<lang toka>[ arglist array.get type cr ] is show-arg [ dup . char: = emit space ] is #= 1 #args [ i #= show-arg ] countedLoop</lang>
UNIX Shell
Bourne Shell
To retrieve the entire list of arguments: <lang bash>WHOLELIST="$@"</lang> To retrieve the second and fifth arguments: <lang bash>SECOND=$2 FIFTH=$5</lang>
Ursala
Command line arguments are accessible to an application through a data structure initialized by the run-time system. This example application does nothing but display the data structure on standard output. <lang Ursala>#import std
- executable ('parameterized',)
clarg = <.file$[contents: --<>+ _option%LP]>+ ~command.options</lang> Here is a bash terminal session.
$ clarg -c alpha,beta -h gamma --foo=bar,baz < option[ keyword: 'c', parameters: <'alpha','beta'>], option[ position: 1, keyword: 'h', parameters: <'gamma'>], option[ position: 2, longform: true, keyword: 'foo', parameters: <'bar','baz'>]>
V
The arguments to the program are stored in the stack,
args.v <lang v>$stack puts
./args.v a b c =[args.v a b c]</lang>
Visual Basic .NET
This syntax will tokenize the command line arguments. Tokens are normally delimited by spaces, but spaces can be part of a token if surrounded by quotes.
<lang vbnet>Sub Main(ByVal args As String())
For Each token In args Console.WriteLine(token) Next
End Sub</lang>