Jump to content

Command-line arguments

From Rosetta Code
Revision as of 22:46, 12 November 2024 by Mue (talk | contribs) ({{header|LDPL}})
Task
Command-line arguments
You are encouraged to solve this task according to the task description, using any language you may know.
Command-line arguments is part of Short Circuit's Console Program Basics selection.

Retrieve the list of command-line arguments given to the program. For programs that only print the arguments when run directly, see Scripted main.

See also Program name.

For parsing command line arguments intelligently, see Parsing command-line arguments.

Example command line:

myprogram -c "alpha beta" -h "gamma"

11l

:argv is a list containing all command line arguments, including the program name.

:start:
print(‘Program name: ’:argv[0])
print("Arguments:\n":argv[1..].join("\n"))

8080 Assembly

This program runs under CP/M. CP/M includes some very rudimentary argument parsing: it assumes that the first two space-separated arguments are filenames. Apart from that you can get the raw command line, except that all lowercase letters are made uppercase.

If you need any further parsing, the program needs to do that by itself, which led to many people not bothering. (The CP/M assembler in particular is infamous for abusing the file extension to take arguments.) The following program shows everything CP/M gives it.

putch:	equ	2	; CP/M syscall to print character
puts:	equ	9	; CP/M syscall to print $-terminated string
arglen:	equ	80h	; Length of argument
argmt:	equ	81h	; Argument string
fcb1:	equ	5Ch	; FCBs
fcb2:	equ	6Ch
	org	100h
	;;;	Print all argument(s) as given
	lxi	d,cmdln	; Print 'Command line: '
	mvi	c,puts
	call	5
	lda	arglen	; Retrieve the length of the argument 
	lxi	h,argmt	; Pointer to argument string
	call	plstr	
	;;;	CP/M also assumes that the first two words on the command
	;;;	line are filenames, and prepares two FCBs with the filenames
	;;;	in them. If there are no filenames, they will be blank.
	lxi	d,file1	; Print the first one
	mvi	c,puts
	call	5
	mvi	a,11	; Filenames are 8+3 characters long and padded with
	lxi	h,fcb1+1	; spaces
	call	plstr
	lxi	d,file2	; Print the second one
	mvi	c,puts
	call	5
	mvi	a,11
	lxi	h,fcb2+1
	; ... fall through - on small systems saving bytes is a virtue
	;;;	This subroutine prints a length-A string in HL.
plstr:	ana	a	; If A=0, print nothing.
	rz
	push	psw	; Save A and HL registers on the stack
	push	h	; (CP/M syscalls clobber all registers)
	mov	e,m	; Print character under HL
	mvi	c,putch
	call	5
	pop	h	; Restore A and HL registers
	pop	psw
	inx	h	; Increment string pointer
	dcr	a	; Decrement character counter
	jnz	plstr	; Print next character if not zero
	ret
cmdln:	db	'Command line: $'
file1:	db	13,10,'File 1: $'
file2:	db	13,10,'File 2: $'
Output:
A>args
A>args
Command line:
File 1:            
File 2:            
A>args -c "alpha beta" -h "gamma"
Command line:  -C "ALPHA BETA" -H "GAMMA"
File 1: -C         
File 2: "ALPHA     
A>args foobar.baz barbaz.qux
Command line:  FOOBAR.BAZ BARBAZ.QUX
File 1: FOOBAR  BAZ
File 2: BARBAZ  QUX

8086 Assembly

The method for doing this depends on the memory model of your program. For a COM file, everything is contained in one segment, including the command line arguments. The program starts at offset 100h and the command line arguments start at 81h. It's as simple as reading from that memory address.

For an EXE file, both the DS and ES registers are set to the program segment prefix as soon as the program begins. You'll need to load from offset 81h to FFh to get the command line arguments.

AArch64 Assembly

Works with: as version Raspberry Pi 3B version Buster 64 bits
or android 64 bits with application Termux
/* ARM assembly AARCH64 Raspberry PI 3B */
/*  program commandLine64.s   */
/************************************/
/* Constantes                       */
/************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc" 

/************************************/
/* Initialized data                 */
/************************************/
.data
szCarriageReturn:  .asciz "\n"
/************************************/
/* UnInitialized data               */
/************************************/
.bss 
.align 4
/************************************/
/*  code section                    */
/************************************/
.text
.global main 
main:                                   // entry of program
    mov fp,sp                           //  fp <- start address
    ldr x4,[fp]                         // number of Command line arguments
    add x5,fp,#8                        // first parameter address 
    mov x2,#0                           // init loop counter
1:
    ldr x0,[x5,x2,lsl #3]               // string address parameter
    bl affichageMess                    // display string
    ldr x0,qAdrszCarriageReturn
    bl affichageMess                    // display carriage return
    add x2,x2,#1                        // increment counter
    cmp x2,x4                           // number parameters ?
    blt 1b                              // loop

100:                                    // standard end of the program
    mov x0, #0                          // return code
    mov x8,EXIT 
    svc 0                               // perform the system call

qAdrszCarriageReturn:    .quad szCarriageReturn

/***************************************************/
/*      ROUTINES INCLUDE                           */
/***************************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeARM64.inc"
Output:
~/.../rosetta/asm4 $ commandLine64 toto tutu
commandLine64
toto
tutu

Ada

In Ada95 and later versions, command line arguments are available through the predefined package Ada.Command_Line. In Ada83, this would be implementation dependent.

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;

Alternative version using Matreshka

Uses Matreshka

with Ada.Wide_Wide_Text_IO;

with League.Application;
with League.Strings;

procedure Main is
begin
   for J in 1 .. League.Application.Arguments.Length loop
      Ada.Wide_Wide_Text_IO.Put_Line
       (League.Application.Arguments.Element (J).To_Wide_Wide_String);
   end loop;
end Main;

Aikido

The arguments are passed to the program as a vector of strings called args

foreach arg in args {
    println ("arg: " + arg)
}

Aime

integer i;

i = 0;
while (i < argc()) {
    o_text(argv(i));
    o_byte('\n');
    i += 1;
}

ALGOL 68

Works with: ALGOL 68G version Any - tested with release mk15-0.8b.fc9.i386 - argc and argv are not part of the standard's prelude
main:(
  FOR i TO argc DO
    printf(($"the argument #"g(-0)" is "gl$, i, argv(i)))
  OD
)

Linux command:

/usr/bin/a68g Command-line_arguments.a68 - 1 2 3 ...

Output:

the argument #1 is /usr/bin/a68g
the argument #2 is ./Command-line_arguments.a68
the argument #3 is -
the argument #4 is 1
the argument #5 is 2
the argument #6 is 3
the argument #7 is ...

Amazing Hopper

The main function "main(argv,argc)" is a macro-defined in HOPPER.H: get the arguments, and put them into array ARGV; ARGC have total arguments.

Macro MAIN(ARGV, ARGC):

#defn main(_V_,_N_)  #RAND, main:, V#RNDV=1,_V_={#VOID}, \
                     _N_=0,totalarg,mov(_N_), \
                     LOOPGETARG_#RNDV:, {[ V#RNDV ]},push(_V_),++V#RNDV,\
                     {_N_,V#RNDV},jle(LOOPGETARG_#RNDV),clear(V#RNDV)

VERSION 1:

#include <hopper.h>

main(argv, argc)
   {"This program named: "},[1]get(argv),println
   for(i=2, {i}lethan(argc),++i)
      {"Argument #",i," = "}[i]get(argv),println
   next
exit(0)

VERSION 2:

#include <hopper.h>

main:
   total arg, argc=0,mov(argc)
   {"This program named: ",[&1]},println
   i=2
   __CNT_ARGS__:
      {"Argumento #",i," = ",[&i]}println
      ++i,{argc,i}jle(__CNT_ARGS__)
exit(0)

VERSION 3:

#include <hopper.h>

main(argv, argc)
   i=2
   #hl{
      print( "This program named: ",argv[1],"\n")
      while( i <= argc )
         print("Argument #",i," = ",argv[i],"\n")
         i += 1
      wend
   }
exit(0)

VERSION 4:

#include <natural.h>
#include <hopper.h>

main:
   get total arguments, and remember as 'total arguments'.
   remember ("This program named: "),
   now remember ( argument '1' ), and print with a new line.
   secondly, declare 'i', take '2', and store in 'i'
   do while ( variable 'i' is less or equal than 'total arguments', \
              consider this ( {"Argument #",i," = "} );\
              remember ( argument 'i' ); put a new line and print it; finally increment 'i' ).
exit(0)

ETCETERA...

Output:
xu@MrDalien:~/Proyectos/xuesp/HOPPER$ hopper src/args1.com 1 "Rosseta code" 100
This program named: src/args1.com
Argumento #2 = 1
Argumento #3 = Rosseta code
Argumento #4 = 100

AppleScript

#!/usr/bin/env osascript
-- Print first argument
on run argv
  return (item 1 of argv)
end run

ARM Assembly

Works with: as version Raspberry Pi
/* ARM assembly Raspberry PI  */
/*  program commandLine.s   */

/* Constantes    */
.equ STDOUT, 1                         @ Linux output console
.equ EXIT,   1                         @ Linux syscall
.equ WRITE,  4                         @ Linux syscall
/* Initialized data */
.data
szCarriageReturn:  .asciz "\n"

/* UnInitialized data */
.bss 
.align 4

/*  code section */
.text
.global main 
main:                                   @ entry of program
    push {fp,lr}                        @ saves registers
    add fp,sp,#8                        @  fp <- start address
    ldr r4,[fp]                         @ number of Command line arguments
    add r5,fp,#4                        @ first parameter address 
    mov r2,#0                           @ init loop counter
loop:
    ldr r0,[r5,r2,lsl #2]               @ string address parameter
    bl affichageMess                    @ display string
    ldr r0,iAdrszCarriageReturn
    bl affichageMess                    @ display carriage return
    add r2,#1                           @ increment counter
    cmp r2,r4                           @ number parameters ?
    blt loop                            @ loop

100:                                    @ standard end of the program
    mov r0, #0                          @ return code
    pop {fp,lr}                         @restaur  registers
    mov r7, #EXIT                       @ request to exit program
    swi 0                               @ perform the system call

iAdrszCarriageReturn:    .int szCarriageReturn


/******************************************************************/
/*     display text with size calculation                         */ 
/******************************************************************/
/* r0 contains the address of the message */
affichageMess:
    push {r0,r1,r2,r7,lr}                          @ save  registres
    mov r2,#0                                      @ counter length 
1:                                                 @ loop length calculation 
    ldrb r1,[r0,r2]                                @ read octet start position + index 
    cmp r1,#0                                      @ if 0 its over 
    addne r2,r2,#1                                 @ else add 1 in the length 
    bne 1b                                         @ and loop 
                                                   @ so here r2 contains the length of the message 
    mov r1,r0                                      @ address message in r1 
    mov r0,#STDOUT                                 @ code to write to the standard output Linux 
    mov r7, #WRITE                                 @ code call system "write" 
    svc #0                                         @ call systeme 
    pop {r0,r1,r2,r7,lr}                           @ restaur 2 registres
    bx lr                                          @ return

Arturo

loop arg 'a [
	print a
]

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). "

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\""

AWK

#!/usr/bin/awk -f

BEGIN {
  print "There are " ARGC "command line parameters"
  for(l=1; l<ARGC; l++) {
    print "Argument " l " is " ARGV[l]
  }
}

Babel

Invoke Babel in interactive mode with arguments using the -i switch:

babel -i Larry Mo Curly

Print the argv list with newlines:

argv prn !
Output:
Larry
Mo
Curly

Print the argv list with spaces:

argv prs !
Output:
Larry Mo Curly

To access an individual argument, use the ith operator to select an element from the argv list; print with newline using say:

argv 1 ith say !
Output:
Mo

BASIC

Works with: QuickBASIC

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 retrieve the program's name.)

PRINT "args: '"; COMMAND$; "'"

Sample output:

args: 'This is a test.'
Works with: FreeBASIC

FreeBASIC supplies three ways to retrieve the arguments: COMMAND$ (which works identically to QuickBASIC's COMMAND$), COMMAND$() (a string array which works like C's argv[]), and __FB_ARGV__ (an array of pointers which works even more like C's argv[]) and __FB_ARGC__ (which works like C's argc).

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

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'

BaCon

' Command line arguments including program name
PRINT "Entire command line: ", ARGUMENT$

SPLIT ARGUMENT$ BY " " TO cli$ SIZE args
PRINT "Skip program name:";
FOR i = 1 TO args - 1
    PRINT " " & cli$[i];
NEXT
PRINT
Output:
prompt$ bacon command-line.bac
Converting 'command-line.bac'... done, 9 lines were processed in 0.002 seconds.
Compiling 'command-line.bac'... cc  -c command-line.bac.c
cc -o command-line command-line.bac.o -lbacon -lm
Done, program 'command-line' ready.

prompt$ ./command-line -c "alpha beta" -h "gamma"
Entire command line: ./command-line -c "alpha beta" -h gamma
Skip program name: -c "alpha beta" -h gamma

Batch File

Works with: Windows NT version 4 or later (includes Windows XP and onward)
@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]!
)

Another way of doing it

::args2.cmd
@echo off
setlocal enabledelayedexpansion
set fn=%~f0
set p0=%~0
set p*=%*
set /a c=1
:loop
if @%1==@ goto done
	set p%c%=%~1
	set /a c=c+1
	shift
	goto loop
:done
set /a c=c-1
set p#=%c%
echo fn=%fn%
echo p0=%p0%
echo p*=%p*%
echo p#=%p#%
for /l %%i in (1,1,%p#%) do (
	echo p%%i=!p%%i!
)

Invocation:

>args2 foo "bar baz" quux
fn=d:\bin\args2.cmd
p0=args2
p*=foo "bar baz" quux
p#=3
p1=foo
p2=bar baz
p3=quux

BBC BASIC

PRINT @cmd$

Blue

Linux/x86-64

global _start

: syscall ( num:eax -- result:eax | rcx ) syscall ;

: exit ( status:edi -- noret ) 60 syscall ;
: bye ( -- noret ) 0 exit ;
: die ( err:eax -- noret ) neg exit ;

: unwrap ( result:eax -- value:eax ) dup 0 cmp ' die xl ;
: ordie ( result -- ) unwrap drop ;

1 const stdout

: write ( buf:esi len:edx fd:edi -- ) 1 syscall ordie ;
: print ( buf len -- ) stdout write ;

: newline ( -- ) s" \n" print ;
: println ( buf len -- ) print newline ; 

: find0 ( start:rsi -- end:rsi ) lodsb 0 cmp latest xne ; 
: cstrlen ( str:rdi -- len:rsi ) dup find0 swap sub dec ;
: cstr>str ( cstr:rdx -- str:rsi len:rdx ) dup cstrlen xchg ;

: print-arg ( arg -- ) cstr>str println ;

: _start ( rsp -- noret ) dup @ swap 
: print-args ( argc:rcx argv:rsp -- noret ) 
	8 add @ print-arg latest loop 
	bye 
;

BQN

BQN has a system value for getting pre-parsed command line arguments.

•Show •args

should show the full list of args.

Bracmat

When Bracmat is started with one or more arguments, each argument is evaluated as if it were a Bracmat expression unless an argument (for example the first one) consumes the next argument(s) by calling arg$. Each invocation of arg$ pops one argument from the remaining list of arguments. Calling arg$ when no more arguments are available results in failure. The following program iterates over all arguments following the currently evaluated argument and outputs the argument to standard output.

whl'(arg$:?a&out$(str$("next arg=" !a)))

Now run Bracmat with this program as the first argument in a DOS environment:

bracmat "whl'(arg$:?a&out$(str$(\"next arg=\" !a)))" "a" /b -c 2+3 'd;' "out$(\"13+7=\" 13+7)"

Instead of starting in interactive mode, Bracmat interprets the first argument, which consumes all following arguments. This is output to standard output:

next arg=a
next arg=/b
next arg=-c
next arg=2+3
next arg='d;'
next arg=out$("13+7=" 13+7)

If given an argument index, arg$<arg index> returns the indexed argument without consuming any argument.

bracmat "0:?n&whl'(arg$!n:?a&out$str$(arg[ !n \"]=\" !a)&1+!n:?n)" "a" /b -c 2+3 'd;' "out$(\"13+7=\" 13+7)"

Output:

arg[0]=bracmat
arg[1]=0:?n&whl'(arg$!n:?a&out$str$(arg[ !n "]=" !a)&1+!n:?n)
arg[2]=a
arg[3]=/b
arg[4]=-c
arg[5]=2+3
arg[6]='d;'
arg[7]=out$("13+7=" 13+7)
13+7= 20

The last line demonstrates that not only the first argument is evaluated, but also the following arguments.

If Bracmat is run without arguments, Bracmat starts in interactive mode. In that situation calling arg$ fails. The same is true if Bracmat is compiled as a shared library (DLL or so).

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.

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

int main(int argc, char* argv[])
{
  int i;
  (void) printf("This program is named %s.\n", argv[0]);
  for (i = 1; i < argc; ++i)
    (void) printf("the argument #%d is %s\n", i, argv[i]);
  return EXIT_SUCCESS;
}

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.

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]));
        }
    }
}

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.

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]));
        }
    }
}

C++

Command line arguments are passed the same way as in C.

This example uses <iostream>. C-style i/o also works.

#include <iostream>

int main(int argc, const char* argv[]) {
    std::cout << "This program is named " << argv[0] << '\n'
              << "There are " << argc - 1 << " arguments given.\n";
    for (int i = 1; i < argc; ++i)
        std::cout << "The argument #" << i << " is " << argv[i] << '\n';
}

C3

Command line arguments are passed to main and will be converted to UTF-8 strings on all platforms.

import std::io;

fn void main(String[] args)
{
  io::printfn("This program is named %s.", args[0]);
  for (int i = 1; i < args.len; i++)
  {
    io::printfn("the argument #%d is %s\n", i, args[i]);
  }
}


Clean

getCommandLine from the module ArgEnv returns an array of command-line arguments (the first element is the name of the program).

import ArgEnv

Start = getCommandLine

Clojure

The value of *command-line-args* is a sequence of the supplied command line arguments, or nil if none were supplied.

(dorun (map println *command-line-args*))

CLU

While it is not part of the language standard as specified in the reference manual, Portable CLU includes a library function get_argv which returns all the arguments in order.

Note that unlike C, the program name itself is not included in the list of arguments.

% This program needs to be merged with PCLU's "useful.lib",
% where get_argv lives.
%
% pclu -merge $CLUHOME/lib/useful.lib -compile cmdline.clu

start_up = proc ()
    po: stream := stream$primary_output()
    
    args: sequence[string] := get_argv()
    
    for arg: string in sequence[string]$elements(args) do
        stream$putl(po, "arg: " || arg)
    end
end start_up
Output:
$ ./cmdline -c "alpha beta" -h "gamma"
arg: -c
arg: alpha beta
arg: -h
arg: gamma

COBOL

The COBOL standard appears to say nothing regarding the retrieval of command-line arguments, although methods of retrieving them are provided by most vendors.

Works with: OpenCOBOL
Works with: Visual COBOL

Getting the arguments in one go, exactly as they were passed in:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. accept-all-args.
       
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  args                   PIC X(50).
       
       PROCEDURE DIVISION.
       main-line.
           ACCEPT args FROM COMMAND-LINE
           DISPLAY args
           
           GOBACK
           .

Getting the arguments one at a time, with arguments being split by whitespace if not in quotes:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. accept-args-one-at-a-time.
       
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  arg                 PIC X(50) VALUE SPACES.
       
       PROCEDURE DIVISION.
           ACCEPT arg FROM ARGUMENT-VALUE
           PERFORM UNTIL arg = SPACES
               DISPLAY arg
               MOVE SPACES TO arg
               ACCEPT arg FROM ARGUMENT-VALUE
           END-PERFORM
           
           GOBACK
           .

Passing arguments from UNIX/Linux Systems to COBOL.

Works with: OpenCOBOL
Works with: gnuCOBOL
       *>Created By Zwiegnet 8/19/2004

        IDENTIFICATION DIVISION.
        PROGRAM-ID. arguments.

        ENVIRONMENT DIVISION.

        DATA DIVISION.


        WORKING-STORAGE SECTION.

        01 command1 PIC X(50).
        01 command2 PIC X(50).
        01 command3 PIC X(50).


        PROCEDURE DIVISION.
       
        PERFORM GET-ARGS.

        *> Display Usage for Failed Checks
        ARGUSAGE.
        display "Usage: <command1> <command2> <command3>"
        STOP RUN.

        *> Evaluate Arguments
        GET-ARGS.
        ACCEPT command1 FROM ARGUMENT-VALUE
        IF command1 = SPACE OR LOW-VALUES THEN
        PERFORM ARGUSAGE
        ELSE
        INSPECT command1 REPLACING ALL SPACES BY LOW-VALUES


        ACCEPT command2 from ARGUMENT-VALUE
        IF command2 = SPACE OR LOW-VALUES THEN
        PERFORM ARGUSAGE
        ELSE
        INSPECT command2 REPLACING ALL SPACES BY LOW-VALUES


        ACCEPT command3 from ARGUMENT-VALUE
        IF command3 = SPACE OR LOW-VALUES THEN
        PERFORM ARGUSAGE
        ELSE
                INSPECT command3 REPLACING ALL SPACES BY LOW-VALUES
        


        *> Display Final Output
        display command1 " " command2 " " command3


        STOP RUN.

.

CoffeeScript

Works with: Node.js
console.log arg for arg in process.argv

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.

The following function could be used to create a uniform way to access the arguments:

(defun argv ()
  (or
   #+clisp (ext:argv)
   #+sbcl sb-ext:*posix-argv*
   #+abcl ext:*command-line-argument-list*
   #+clozure (ccl::command-line-arguments)
   #+gcl si:*command-args*
   #+ecl (loop for i from 0 below (si:argc) collect (si:argv i))
   #+cmu extensions:*command-line-strings*
   #+allegro (sys:command-line-arguments)
   #+lispworks sys:*line-arguments-list*
   nil))

Cowgol

Cowgol includes a function to retrieve command-line arguments in its standard library. The manner in which arguments are parsed is, however, dependent on the operating system.

include "cowgol.coh";
include "argv.coh";

ArgvInit();
var i: uint8 := 0;

loop
    var arg := ArgvNext();
    if arg == 0 as [uint8] then break; end if;
    i := i + 1;
    print_i8(i);
    print(": '");
    print(arg);
    print("'\n");
end loop;
Output:

On Linux:

$ ./args -c "alpha beta" -h "gamma"
1: '-c'
2: 'alpha beta'
3: '-h'
4: 'gamma'

On CP/M:

A>args -c "alpha beta" -h "gamma"
1: '-C'
2: '"ALPHA'
3: 'BETA"'
4: '-H'
5: '"GAMMA"'

D

void main(in string[] args) {
    import std.stdio;

    foreach (immutable i, arg; args[1 .. $])
        writefln("#%2d : %s", i + 1, arg);
}

Dart

main(List<String> args) {
    for(var arg in args)
        print(arg);
}

DCL

case is not preserved unless the parameter is in quotes

$ i = 1
$ loop:
$  write sys$output "the value of P''i' is ", p'i
$  i = i + 1
$  if i .le. 8 then $ goto loop
Output:
$ @command_line_arguments -c "alpha beta" -h "gamma"
the value of P1 is -C
the value of P2 is alpha beta
the value of P3 is -H
the value of P4 is gamma
the value of P5 is 
the value of P6 is 
the value of P7 is 
the value of P8 is

Delphi

// The program name and the directory it was called from are in
// param[0] , so given the axample of myprogram -c "alpha beta" -h "gamma"

  for x := 0 to paramcount do
      writeln('param[',x,'] = ',param[x]);

// will yield ( assuming windows and the c drive as the only drive) :

//  param[0] = c:\myprogram
//  param[1] = -c
//  param[2] = alpha beta
//  param[3] = -h
//  param[4] = gamma

Déjà Vu

Command line arguments are found in !args and !opts.

for i range 0 -- len !args:
	print\( "Argument #" i " is " )
	. get-from !args i

if has !opts :c:
	!print "Ah, the -c option."

if has !opts :four:
	!. get-from !opts :four
Output:
$ vu args-3.deja one two -c three --four=five
Argument #0 is "args-3.deja"
Argument #1 is "one"
Argument #2 is "two"
Argument #3 is "three"
Ah, the -c option.
"five"

The order of command line options is lost.

Draco

Draco comes with a library function that will return each command line argument in turn. It simply splits the command line on whitespace, and does not support quotes.

In the example below, the arguments are additionally all made uppercase. This is however a limitation of the CP/M operating system, and not of Draco.

\util.g

proc nonrec main() void:
    *char par;
    word i;
    i := 0;
    while par := GetPar(); par ~= nil do
        i := i + 1; 
        writeln(i:3, ": '", par, "'")
    od
corp
Output:
A>param -c "alpha beta" -h "gamma"
  1: '-C'
  2: '"ALPHA'
  3: 'BETA"'
  4: '-H'
  5: '"GAMMA"'

E

interp.getArgs()

Eiffel

This class inherits functionality for dealing with command line arguments from class ARGUMENTS. It uses the feature separate_character_option_value to return the values by option name for each of the two arguments.

class
    APPLICATION
inherit
    ARGUMENTS
create
    make
feature {NONE} -- Initialization
    make
            -- Print values for arguments with options 'c' and 'h'.
        do
            print ("Command line argument value for option 'c' is: ")
            print (separate_character_option_value ('c') + "%N")
            print ("Command line argument value for option 'h' is: ")
            print (separate_character_option_value ('h') + "%N")
            io.read_line    -- Keep console window open
        end
end

Output (for command line arguments: -c "alpha beta" -h "gamma"):

Command line argument value for option 'c' is: alpha beta
Command line argument value for option 'h' is: gamma

Elena

ELENA 6.x :

import system'routines;
import extensions;
 
public program()
{
    program_arguments.forEvery::(int i)
        { console.printLine("Argument ",i," is ",program_arguments[i]) }
}
Output:
Argument 0 is myprogram.exe
Argument 1 is -c
Argument 2 is alpha beta
Argument 3 is -h
Argument 4 is gamma

Elixir

Elixir provides command line arguments via the System.argv() function.

#!/usr/bin/env elixir
IO.puts 'Arguments:'
Enum.map(System.argv(),&IO.puts(&1))

Example run:

$ ./show-args.exs a b=2 --3 -4
Arguments:
a
b=2
--3
-4

Emacs Lisp

(while argv
  (message "Argument: %S" (pop argv)))

Invoke script:

emacs --script test.el foo bar baz

Erlang

When used as a script language the arguments is a list to the main/1 function. When compiled use init:get_arguments/0

3> init:get_arguments().

result

[{root,["/usr/erlang/erl5.5"]},
{progname,["erl"]},
{home,["/home/me"]},
{c,["alpha beta"]},
{h,["gamma"]}]

init:get_argument(name) can be used to fetch value of a particular flag

4> init:get_argument(h).
{ok,[["gamma"]]}
5> init:get_argument(c).
{ok,[["alpha beta"]]}

Euphoria

constant cmd = command_line()
printf(1,"Interpreter/executable name: %s\n",{cmd[1]})
printf(1,"Program file name: %s\n",{cmd[2]})
if length(cmd)>2 then
  puts(1,"Command line arguments:\n")
  for i = 3 to length(cmd) do
    printf(1,"#%d : %s\n",{i,cmd[i]}) 
  end for
end if

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.

#light
[<EntryPoint>]
let main args =
    Array.iter (fun x -> printfn "%s" x) args
    0

Factor

USING: io sequences command-line ;
(command-line) [ print ] each

Fancy

ARGV each: |a| {
  a println # print each given command line argument
}

Fantom

class Main
{
  public static Void main (Str[] args) 
  {
    echo ("command-line args are: " + args)
  }
}

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.

Works with: gforth version 0.6.2
\ args.f: print each command line argument on a separate line
: main
  argc @ 0 do i arg type cr loop ;

main bye

Here is output from a sample run.

$ gforth args.f alpha "beta gamma" delta
gforth
args.f
alpha
beta gamma
delta
$

Fortran

Works with: Fortran version 2003 and later
program command_line_arguments

  implicit none
  integer, parameter :: len_max = 256
  integer :: i , nargs
  character (len_max) :: arg
  
  nargs = command_argument_count()
  !nargs = iargc()
  do i = 0, nargs
    call get_command_argument (i, arg)
    !call getarg (i, arg)
    write (*, '(a)') trim (arg)
  end do

end program command_line_arguments

Note: This sample uses the Fortran 2003 intrinsic routines command_argument_count and get_command_argument instead of the nonstandard extensions iargc and getarg. Most Fortran compilers support both.

Sample usage:

> ./a.out -c "alpha beta" -h "gamma"
./a.out
-c
alpha beta
-h
gamma

FreeBASIC

' FB 1.05.0 Win64

' Program (myprogram.exe) invoke as follows:
' myprogram -c "alpha beta" -h "gamma"

Print "The program was invoked like this => "; Command(0) + " " + Command(-1)
Print
Print "Press any key to quit"
Sleep
Output:
The program was invoked like this => myprogram -c alpha beta -h gamma

Frink

Arguments to a program are available in the ARGS array variable.

println[ARGS]

FunL

println( args )

Gambas

Click this link to run this code

PUBLIC SUB main()
  DIM l AS Integer
  DIM numparms AS Integer
  DIM parm AS String
  numparms = Application.Args.Count
  FOR l = 0 TO numparms - 1
    parm = Application.Args[l]
    PRINT l; " : "; parm
  NEXT 
END

Genie

[indent=4]
/*
   Command line arguments, in Genie

   valac commandLine.gs
   ./commandLine sample arguments 'four in total here, including args 0'
*/

init

    // Output the number of arguments
    print "%d command line argument(s):", args.length

    // Enumerate all command line arguments
    for s in args
        print s

    // to reiterate, args[0] is the command
    if args[0] is not null
        print "\nWith Genie, args[0] is the command: %s", args[0]
Output:
prompt$ valac commandLine.gs 
prompt$ ./commandLine -c "alpha beta" -h "gamma"
5 command line argument(s):
./commandLine
-c
alpha beta
-h
gamma

With Genie, args[0] is the command: ./commandLine

Global Script

Command-line arguments are passed to the main program as a linked list of strings (which are also linked lists).

This uses the gsio I/O operations, which are designed to be simple to implement on top of Haskell and simple to use. It also uses impmapM, which is a specific specialization of mapM for the HSGS implementation.

λ 'as. impmapM (λ 'a. print qq{Argument: §(a)\n}) as

Go

package main
import (
	"fmt"
	"os"
)

func main() {
	for i, x := range os.Args[1:] {
		fmt.Printf("the argument #%d is %s\n", i, x)
	}
}

Groovy

Command-line arguments are accessible via the args list variable. The following is saved as the file "Echo.groovy":

println args

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) library, which extends the functionality of the Java-based Apache Commons CLI library to Groovy.

Harbour

Uses the Harbour-specific hb_PValue() function

PROCEDURE Main()

   LOCAL i

   FOR i := 1 TO PCount()
      ? "argument", hb_ntos( i ), "=", hb_PValue( i )
   NEXT

   RETURN

Haskell

Defined by the System module, getArgs :: IO [String] provides the command-line arguments in a list.

myprog.hs:

import System
main = getArgs >>= print
myprog a -h b c
=> ["a","-h","b","c"]

HicEst

DO i = 2, 100 ! 1 is HicEst.exe
  EDIT(Text=$CMD_LINE, SePaRators='-"', ITeM=i, IF ' ', EXit, ENDIF, Parse=cmd, GetPosition=position)
  IF(position > 0) WRITE(Messagebox) cmd
ENDDO

Icon and Unicon

Command line parameters are passed to Icon/Unicon programs as a list of strings.

procedure main(arglist)
every write(!arglist)
end

includes options that parses the command line as switches and arguments and returns the results in a table.

Io

System args foreach(a, a println)

Ioke

System programArguments each(println)

J

The global ARGV holds the command line arguments. Thus, a program to display them:

   ARGV

In a non-interactive context, we would instead use echo ARGV.

Jakt

The main function can recieve the command line arguments as an arbitrarily named array of String. argv[0] will be the name of the program.

fn main(arguments: [String]) {
    println("{}", arguments)
}

Java

The arguments will be passed to main as the only parameter.
The array is non-null.

public static void main(String[] args)

Running this command

myprogram -c "alpha beta" -h "gamma"

Will produce the following

-c
alpha beta
-h
gamma


And alternate demonstration.

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);
  }
}

For more sophisticated command-line option and option-argument parsing use the Apache Commons CLI (command-line interface) library.

JavaScript

Works with: Node.js
process.argv.forEach((val, index) => {
  console.log(`${index}: ${val}`);
});
Works with: JScript
var objArgs = WScript.Arguments;
for (var i = 0; i < objArgs.length; i++)
   WScript.Echo(objArgs.Item(i));
import System;
var argv:String[] = Environment.GetCommandLineArgs();
for (var i in argv)
  print(argv[i]);
Works with: Rhino
Works with: SpiderMonkey
for (var i = 0; i < arguments.length; i++)
    print(arguments[i]);

Joy

#!/usr/bin/joy

argv rest put.
Output:
["-c" "alpha beta" "-h" "gamma"]

jq

Works with: jq version after February 17, 2017


jq distinguishes between command-line arguments and command-line options. Only the former are available programmatically.

Specifically, both named and positional command-line arguments are available in the global constant $ARGS, a JSON object, as follows:

   $ARGS.positional contains an array of the positional arguments as JSON strings
   $ARGS.names is a JSON object of giving the mapping of name to value.

For example, the invocation:

   $ jq -n '$ARGS' --args a b 

yields:

{
  "positional": [
    "a",
    "b"
  ],
  "named": {}
}

Arguments specified with --args are always read as JSON strings; arguments specified with --jsonargs are interpreted as JSON, as illustrated here:

$ jq -n '$ARGS' --argjson x 0 --jsonargs 0 '{"a":1}' 
{
  "positional": [
    0,
    {
      "a": 1
    }
  ],
  "named": {
    "x": 0
  }
}

Jsish

#!/usr/local/bin/jsish
puts(Info.argv0());
puts(console.args);
Output:
$ jsish command-line-arguments.jsi -c "alpha beta" -h "gamma"
/home/btiffin/lang/jsish/command-line-arguments.jsi
[ "-c", "alpha beta", "-h", "gamma" ]

Julia

Works when the Julia program is run as a file argument to julia.exe.

using Printf

prog = Base.basename(Base.source_path())

println(prog, "'s command-line arguments are:")
for s in ARGS
    println("    ", s)
end
Output:
$ julia command_line_arguments.jl -c "alpha beta" -h "gamma"
command_line_arguments.jl's command-line arguments are:
    -c
    alpha beta
    -h
    gamma

Klong

Command line arguments (but not the program name itself) are bound to the variable ".a". The following program prints them, one argument per line:

.p'.a

Kotlin

Translation of: Java
fun main(args: Array<String>) {
     println("There are " + args.size + " arguments given.")
     args.forEachIndexed { i, a -> println("The argument #${i+1} is $a and is at index $i") }
}
Output:

See Java output.

Lang

In lang command line arguments are stored in &LANG_ARGS.

$ele
foreach($[ele], &LANG_ARGS) {
    fn.println($ele)
}

Calling a Lang program with command line arguments depends on the implementation. The following example shows, how this can be achieved in Standard Lang (-- defines the start of the command line arguments for the Lang program):

$ lang cmdarg.lang -- 2 abc test text
Output:
2
abc
test
text

Lasso

#!/usr/bin/lasso9

iterate($argv) => {
  stdoutnl("Argument " + loop_count + ": " + loop_value)
}

Output:

$ lasso9 arguments.lasso -c "alpha beta" -h "gamma"
Argument 1: arguments.lasso
Argument 2: -c
Argument 3: alpha beta
Argument 4: -h
Argument 5: gamma

LDPL

Every LDPL program comes with the argv text list variable declared by default.

If you pass command line arguments to your LDPL compiled program (running, for example, something like myBinary argument1 argument2), the values stored in the argv list (argument vector) will be the values of each argument passed (in this case, "argument1" will be stored in argv:0 and "argument2" in argv:1).

HINT: Given that argv is a text list, the values passed as arguments are always stored as text, even numbers. Naturally, if no arguments are passed to the program, the argv list will be empty.

The following program simply checks for string length of the passed argument. If no argument is given string length is 0 and an error is displayed.

file: argv.ldpl

DATA:
	argument_count IS NUMBER

PROCEDURE:
	GET LENGTH OF argv IN argument_count
	IF argument_count IS EQUAL TO 0 THEN
		DISPLAY "No arguments!" CRLF
	ELSE
		DISPLAY argv:0 CRLF
	END IF

compile:

$ ldpl argv.ldpl
* Loading argv.ldpl
* Compiling argv.ldpl
* Building argv-bin
* Saved as argv-bin
* File(s) compiled successfully.

If you now start your compiled file:

$ ./argv-bin test
test
$ ./argv-bin
No arguments!

LFE

To demonstrate this, we can start the LFE REPL up with the parameters for this example:

$ ./bin/lfe -pa ebin/ -c "alpha beta" -h "gamma"

Once we're in the shell, we can get all the initializing arguments with this call:

> (: init get_arguments)
(#(root ("/opt/erlang/r15b03"))
 #(progname ("erl"))
 #(home ("/Users/oubiwann"))
 #(user ("lfe_boot"))
 #(pa ("ebin/"))
 #(c ("alpha beta"))
 #(h ("gamma")))

We can also get specific arguments if we know their keys:

> (: init get_argument 'c)
#(ok (("alpha beta")))
> (: init get_argument 'h)
#(ok (("gamma")))

Liberty BASIC

print CommandLine$

Lingo

put the commandline
-- "-c alpha beta -h gamma"

In latest versions of Mac OS X, the above approach doesn't work anymore. But there is a free "Xtra" (binary plugin/shared library) called "CommandLine Xtra" that works both in Windows and Mac OS X and returns the command-line parsed into a lingo list (array):

put getCommandLineArgs()
-- ["-c", "alpha beta", "-h", "gamma"]

Works with: UCB Logo version 5.6

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

show :COMMAND.LINE
[arg1 arg2 arg3]

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

argc , nl  # number of arguments (including command itself)
0         # argument
dup arg dup 0 = || ,t  1 + repeat
drop

Lua

The lua scripting language does not use argc and argv conventions for the command line parameters. Instead, the command line parameters to the main script are provided through the global table arg. The script name is placed into element zero of arg, and the script parameters go into the subsequent elements:

print( "Program name:", arg[0] )

print "Arguments:"
for i = 1, #arg do
    print( i," ", arg[i] )
end

M2000 Interpreter

function quote$("a") return "a" a string in ""

Arguments in command line maybe two kinds, in first part those three letters identifiers with + or - for switches for interpreter and the last part to executed before loading the actual script.

For this example we make a script, save to temporary directory, and call it passing arguments. We can use Win as shell substitute in M2000 environment, or the Use statement. Reading the shell statement Win we can see how the command line composed. We call the m2000.exe in the appdir$ (application directory, is the path to M2000.exe), and pass a string as a file with a path. That path will be the current path for the new start of m2000.exe the host for M2000 Interpreter (an activeX dll).

Module Checkit {
      Document a$ = {
      Module Global A {
            Show
            Read a$="nothing", x=0
            Print a$, x
            A$=Key$
      } 
      A: End
      }
      Dir temporary$
      Save.doc a$, "program.gsb"
      \\ open if gsb extension is register to m2000.exe
      Win quote$(dir$+"program.gsb")
      \\ +txt is a switch for interpreter to use string comparison as text (not binary)
      \\ so we can send switches and commands before the program loading
      Win appdir$+"m2000.exe", quote$(dir$+"program.gsb +txt : Data {Hello}, 100")
      \\ no coma after name (we can use "program.gsb" for  names with spaces)
      Use program.gsb  "From Use statement", 200
      \\ delete file
      Wait 5000
      Dos "del "+quote$(dir$+"program.gsb");
      \\ open directory
      Rem : Win temporary$
}
Checkit

Mathematica /Wolfram Language

myprogram:

#!/usr/local/bin/MathematicaScript -script
$CommandLine

Output:

{myprogram,-c,alpha beta,-h,gamma}

Mercury

:- module cmd_line_args.
:- interface.

:- import_module io.
:- pred main(io::di, io::uo) is det.

:- implementation.
:- import_module int, list, string.

main(!IO) :-
    io.progname("", ProgName, !IO),
    io.format("This program is named %s.\n", [s(ProgName)], !IO),
    io.command_line_arguments(Args, !IO),
    list.foldl2(print_arg, Args, 1, _, !IO).

:- pred print_arg(string::in, int::in, int::out, io::di, io::uo) is det.

print_arg(Arg, ArgNum, ArgNum + 1, !IO) :-
    io.format("the argument #%d is %s\n", [i(ArgNum), s(Arg)], !IO).

min

Works with: min version 0.19.3
args

MMIX

argv   IS    $1
argc   IS    $0
i      IS    $2

       LOC   #100
Main   LOC   @
       SETL  i,1               % i = 1
Loop   CMP   $3,argc,2         % argc < 2 ?
       BN    $3,1F             % then jump to end
       XOR   $255,$255,$255    % clear $255
       8ADDU $255,i,argv       % i*8 + argv
       LDOU  $255,$255,0       % argv[i]
       TRAP  0,Fputs,StdOut    % write the argument
       GETA  $255,NewLine      % add a newline
       TRAP  0,Fputs,StdOut
       INCL  i,1               % increment index
       SUB   argc,argc,1       % argc--
       BP    argc,Loop         % argc > 0? then Loop
1H     LOC   @
       XOR   $255,$255,$255    % exit(0)
       TRAP  0,Halt,0

NewLine BYTE #a,0

Modula-2

MODULE try;

FROM  Arguments  IMPORT  GetArgs, ArgTable, GetEnv;
FROM  InOut      IMPORT  WriteCard, WriteLn, WriteString;

VAR   count, item        : SHORTCARD;
      storage            : ArgTable;

BEGIN
   GetArgs (count, storage);
   WriteString ('Count =');     WriteCard (count, 4);   WriteLn;
   item := 0;
   REPEAT
      WriteCard (item, 4);
      WriteString (' :  ');
      WriteString (storage^ [item]^);
      WriteLn;
      INC (item)
   UNTIL item = count
END try.

Example:

jan@Beryllium:~/modula/test$ try jantje zag eens pruimen hangen
Count =   6
   0 :  try
   1 :  jantje
   2 :  zag
   3 :  eens
   4 :  pruimen
   5 :  hangen

Modula-3

Command line parameters are accessed using the Params module.

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.

Output:

martin@thinkpad:~$ ./prog
./prog
martin@thinkpad:~$ ./prog 10
./prog
10
martin@thinkpad:~$ ./prog 10 20
./prog
10
20

Nanoquery

Translation of: Ursa
//
// command-line arguments
//

// output all arguments
for i in range(0, len(args) - 1)
	println args[i]
end
Output:
$ java -jar ../nanoquery-2.3_1700.jar -b cmdline.nq "alpha beta" -h "gamma"
-b
cmdline.nq
alpha beta
-h
gamma

Neko

/* command line arguments, neko */
var argc = $asize($loader.args)

/* Display count and arguments, indexed from 0, no script name included */
$print("There are ", argc, " arguments\n")

var arg = 0
while arg < argc $print($loader.args[arg ++= 1], "\n")
Output:
prompt$ nekoc command-line-arguments.neko
prompt$ neko ./command-line-arguments.n -c "alpha beta" -h "gamma"
There are 4 arguments
-c
alpha beta
-h
gamma

Nemerle

using System;
using System.Console;

module CLArgs
{
    Main(args : array[string]) : void
    {
        foreach (arg in args) Write($"$arg "); // using the array passed to Main(), everything after the program name
        Write("\n");
        
        def cl_args = Environment.GetCommandLineArgs(); // also gets program name
        foreach (cl_arg in cl_args) Write($"$cl_arg ");
    }
}

NetRexx

In a stand-alone application NetRexx places the command string passed to it in a variable called arg.

/* NetRexx */
-- sample arguments: -c "alpha beta" -h "gamma"
say "program arguments:" arg

Output:

program arguments: -c "alpha beta" -h "gamma"

Nim

import os
echo "program name: ", getAppFilename()
echo "Arguments:"
for arg in commandLineParams():
  echo arg

Nu

In Nu, the special main function can be declared, which gets passed the cli arguments.

def main [...argv] {
	$argv | print
}
Output:
~> nu cli.nu A B C "Hello World!"
╭───┬──────────────╮
│ 0 │ A            │
│ 1 │ B            │
│ 2 │ C            │
│ 3 │ Hello World! │
╰───┴──────────────╯                                                                                                 

Oberon-2

Works with: oo2c
MODULE CommandLineArguments;
IMPORT
  NPCT:Args,
  Out := NPCT:Console;

BEGIN
  Out.String("Args number: ");Out.Int(Args.Number(),0);Out.Ln;
  Out.String("0.- : ");Out.String(Args.AsString(0));Out.Ln;
  Out.String("1.- : ");Out.String(Args.AsString(1));Out.Ln;
  Out.String("2.- : ");Out.String(Args.AsString(2));Out.Ln;
  Out.String("3.- : ");Out.String(Args.AsString(3));Out.Ln;
  Out.String("4.-: ");Out.String(Args.AsString(4));Out.Ln
END CommandLineArguments.
Output:
Args number: 5
0.- : bin/CommandLineArguments
1.- : -c
2.- : alpha beta
3.- : -h
4.-: gamma

Objeck

class Line {
  function : Main(args : String[]) ~ Nil {
    each(i : args) {
      args[i]->PrintLine();
    };
  }
}

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:

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]);
}

OCaml

The program name is also passed as "argument", so the array length is actually one more than the number of program arguments.

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

Using the Arg module

(* 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.Set somebool, ": set somebool to true");
    ("-s", Arg.Set_string somestr, ": what follows -s sets some string");
    ("-d", Arg.Set_int someint, ": 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
$ ocaml arg.ml --help
usage: arg.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
  --help  Display this list of options

$ ocaml arg.ml -d 4 -b -s blabla
 true 4 'blabla'

$ ocaml arg.ml
 false 0 ''

Odin

package main

import "core:os"
import "core:fmt"

main :: proc() {
  fmt.println(os.args)
}

// Run:     ./program -c "alpha beta" -h "gamma"
// Output:  ["./program", "-c", "alpha beta", "-h", "gamma"]

Oforth

System.Args returns command line arguments.

All arguments that begin with "--" are not included into this list. The first argument is the program name, so this list is never empty.

System.Args println

Oz

Raw arguments

Like in C, but without the program name:

functor
import Application System
define
   ArgList = {Application.getArgs plain}
   {ForAll ArgList System.showInfo}
   {Application.exit 0}
end

Preprocessed arguments

functor
import Application System
define
   ArgSpec =
   record(
      c(type:string single      %% option "--c" expects a string, may only occur once,
	optional:false char:&c) %% is not optional and has a shortcut "-c"
	  
      h(type:string single      %% option "--h" expects a string, may only occur once,
	default:"default h"     %% is optional and has a default value if not given
	char:&h)                %% and has a shortcut "-h"
      )
   Args = {Application.getArgs ArgSpec}
   {System.showInfo Args.c}
   {System.showInfo Args.h}
   {Application.exit 0}
end

Pascal

Free Pascal

Program listArguments(input, output, stdErr);

Var 
  i: integer;
Begin
  writeLn('program was called from: ',paramStr(0));
  For i := 1 To paramCount() Do
    Begin
      writeLn('argument',i:2,' : ', paramStr(i));
    End;
End.
Output:
./Commandlinearguments -c "alpha beta" -h "gamma"
program was called from: /home/user/Documents/GitHub/rosettacode/Commandlinearguments
argument 1 : -c
argument 2 : alpha beta
argument 3 : -h
argument 4 : gamma


PascalABC.NET

begin
  for var i:=1 to ParamCount do
    Print(ParamStr(i));
end.

Perl

Works with: Perl version 5.x

@ARGV is the array containing all command line parameters

my @params = @ARGV;
my $params_size = @ARGV; 
my $second = $ARGV[1];
my $fifth = $ARGV[4];

If you don't mind importing a module:

use Getopt::Long;
GetOptions ( 
    'help|h'     => \my $help,
    'verbose|v'  => \my $verbose,
);

Phix

with javascript_semantics
constant cmd = command_line()
?cmd
if cmd[1]=cmd[2] then
    printf(1,"Compiled executable name: %s\n",{cmd[1]})
else
    printf(1,"Interpreted (using %s) source name: %s\n",cmd[1..2])
end if
if length(cmd)>2 then
  puts(1,"Command line arguments:\n")
  for i = 3 to length(cmd) do
    printf(1,"#%d : %s\n",{i,cmd[i]}) 
  end for
end if

When interpreting, the first two elements returned by command_line() are {interpreter,source}.
When compiled, the first two elements are instead {executable,executable}, so the parameters (if any) are consistently the 3rd element onwards.

Output:

desktop/Phix (Windows, Linux would be fairly similar but obviously with different paths):

C:\Program Files (x86)\Phix>p testcl -c "alpha beta" -h "gamma"
{"C:\\Program Files (x86)\\Phix\\p.exe","C:\\Program Files (x86)\\Phix\\testcl.exw","-c","alpha beta","-h","gamma"}
Interpreted (using C:\Program Files (x86)\Phix\p.exe) source name: C:\Program Files (x86)\Phix\testcl.exw
Command line arguments:
#3 : -c
#4 : alpha beta
#5 : -h
#6 : gamma
C:\Program Files (x86)\Phix>p -c testcl -c "alpha beta" -h "gamma"
{"C:\\Program Files (x86)\\Phix\\testcl.exe","C:\\Program Files (x86)\\Phix\\testcl.exe","-c","alpha beta","-h","gamma"}
Compiled executable name: C:\Program Files (x86)\Phix\testcl.exe
Command line arguments:
#3 : -c
#4 : alpha beta
#5 : -h
#6 : gamma
C:\Program Files (x86)\Phix>testcl -c "alpha beta" -h "gamma"
{"C:\\Program Files (x86)\\Phix\\testcl.exe","C:\\Program Files (x86)\\Phix\\testcl.exe","-c","alpha beta","-h","gamma"}
Compiled executable name: C:\Program Files (x86)\Phix\testcl.exe
Command line arguments:
#3 : -c
#4 : alpha beta
#5 : -h
#6 : gamma
C:\Program Files (x86)\Phix>

pwa/p2js: There isn't really a command line, you always get a result of length 2.

{"p2js","file:///C:/Program%20Files%20(x86)/Phix/pwa/test.htm"}
Interpreted (using p2js) source name: file:///C:/Program%20Files%20(x86)/Phix/pwa/test.htm

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.

<?php
$program_name = $argv[0];
$second_arg = $argv[2];
$all_args_without_program_name = array_shift($argv);

Picat

Picat has no built-in option parser, and the user must write a specific parser for each use case. The arguments to a Picat programs are available via main/1 as a list of strings.

main(ARGS) =>
  println(ARGS).
main(_) => true.
Output:
picat command_line_arguments.pi -c "alpha beta" -h "gamma"          
[-c,alpha beta,-h,gamma]

See the task Command-line_arguments for a simple option parser.

PicoLisp

There are three ways to handle command-line arguments in PicoLisp:

1. Obtain all arguments as a list of strings via 'argv'

2. Fetch each argument individually with 'opt'

3. Use the built-in command-line interpretation, where arguments starting with a hyphen are executed as functions.

Here we use the third option, as it is not so obvious, sometimes more flexible, and in fact the most commonly used one for application development.

We define 'c' and 'h' as functions, which retrieve their argument with 'opt', and then 'load' all remaining command line arguments.

#!/usr/bin/picolisp /usr/lib/picolisp/lib.l

(de c ()
   (prinl "Got 'c': " (opt)) )

(de h ()
   (prinl "Got 'h': " (opt)) )

(load T)
(bye)

Output:

$ ./myprogram -c "alpha beta" -h "gamma"
Got 'c': alpha beta
Got 'h': gamma

PL/I

/* The entire command line except the command word itself is passed */
/* to the parameter variable in PL/I.                               */
program: procedure (command_line) options (main);
   declare command_line character (100) varying;

...

end program;

Pop11

variable poparglist contains list of command line arguments (as strings). One can use iteration over list to process then (for example print).

lvars arg;
for arg in poparglist do
   printf(arg, '->%s<-\n');
endfor;

PowerBASIC

For versions of PowerBASIC prior to PB/Win 9 and PB/CC 5, the only option available is identical to the one used by QuickBASIC above:

? "args: '"; COMMAND$; "'"

Current versions of PowerBASIC (with the likely exception of PB/DOS) include COMMAND$() that works similarly to FreeBASIC's COMMAND$(), except that you can't retrieve the application's name:

'these two both return ALL args
? COMMAND$
? COMMAND$(0)

DO WHILE(LEN(COMMAND$(i)))
    PRINT "The argument "; i; " is "; COMMAND$(i)
    i = i + 1
LOOP

PowerShell

In PowerShell the arguments to a script can be accessed with the $args array:

$i = 0
foreach ($s in $args) {
    Write-Host Argument (++$i) is $s
}

Prolog

The command line arguments supplied to a Prolog interpreter can be accessed by passing os_argv to current_prolog_flag/2.

:-
    current_prolog_flag(os_argv, Args),
    write(Args).

Alternatively, argv can be used to access only the arguments *not* consumed by the Prolog interpreter.

:-
    current_prolog_flag(argv, Args),
    write(Args).

This omits the interpreter name, the input Prolog filename, and any other arguments directed at the Prolog interpreter.

Pure

Arguments are in global variables, argc and argv.

using system;

printf "There are %d command line argumants\n" argc;
puts "They are " $$ map (puts) argv;

PureBasic

Reading all parameters

You can easily read all parameters by using ProgramParameter() without argument.

If OpenConsole()
  Define n=CountProgramParameters()
  PrintN("Reading all parameters")
  While n
    PrintN(ProgramParameter())
    n-1
  Wend
  Print(#CRLF$+"Press Enter")
  Input()
  CloseConsole()
EndIf

Reading specific parameters

You can specify which parameter 'n' to read.

If OpenConsole()
  Define n
  PrintN("Reading specific pameters")
  For n=0 To CountProgramParameters()
    PrintN(ProgramParameter(n))
  Next
  Print(#CRLF$+"Press Enter")
  Input()
  CloseConsole()
EndIf

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:

import sys
program_name = sys.argv[0]
arguments = sys.argv[1:]
count = len(arguments)

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).

For powerful option parsing capabilities check out the optparse module.

R

Following adapted from this post by Forester:

Suppose you want to call your script test.r with the arguments a=1 b=c(2,5,6), where b is a numeric vector. Suppose you also want to redirect your output to test.out (not that you have a choice--I still don't know how to make R send shell-script output to stdout). You would then run

R CMD BATCH --vanilla --slave '--args a=1 b=c(2,5,6)' test.r test.out

from the commandline, with the following text in test.r:

# Read the commandline arguments
args <- (commandArgs(TRUE))

# args is now a list of character vectors
# First check to see if any arguments were passed,
# then evaluate each argument.
if (length(args)==0) {
    print("No arguments supplied.")
    # Supply default values
    a <- 1
    b <- c(1,1,1)
} else {
    for (i in 1:length(args)) {
         eval(parse(text=args[[i]]))
    }
}
print(a*2)
print(b*3)

(possibly preceding code that actually does something :-) Your output test.out would then contain (e.g., if you cat it)

[1] 2
[1]  6 15 18
> proc.time()
   user  system elapsed 
  0.168   0.026   0.178 

If you know how to get the output

  • sent to stdout (i.e., as is normal with shell scripts)
  • done without the profiling

please update this example!

Racket

The following is the simplest program that prints the command-line arguments:

#lang racket
(current-command-line-arguments)

You can also explicitly print each argument to standard output:

#lang racket

(for ([arg (current-command-line-arguments)]) (displayln arg))

Raku

(formerly 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; for more detailed information see: https://docs.raku.org/language/create-cli

# with arguments supplied
$ raku -e 'sub MAIN($x, $y) { say $x + $y }' 3 5
8

# missing argument:
$ raku -e 'sub MAIN($x, $y) { say $x + $y }' 3 
Usage:
-e '...' x y

If the program is stored in a file, the file name is printed instead of -e '...'.

RapidQ

PRINT "This program is named "; Command$(0)
FOR i=1 TO CommandCount
    PRINT "The argument "; i; " is "; Command$(i)
NEXT i

Raven

ARGS print

stack (6 items)
 0 => "raven"
 1 => "myprogram"
 2 => "-c"
 3 => "alpha beta"
 4 => "-h"
 5 => "gamma"

REALbasic

Function Run(args() as String) As Integer
  For each arg As String In args
    Stdout.WriteLine(arg)
  Next
End Function

Output (given arguments: --foo !bar "bat bang"):

appName.exe
--foo
!bar
bat bang

REXX

The entire command line arguments (as a single string) are passed by REXX to the program.

say 'command arguments:'
say arg(1)

Input:

myprogram -c "alpha beta" -b "gamma"

However, in the above example (as shown), it's suggested that (maybe) only options that start with a minus (-) are to be examined and assumed to be options.

parse arg aaa                          /*get the arguments.        */
                                       /*another version:          */
                                       /*  aaa=arg(1)              */
say 'command arguments:'
say aaa

opts=''                                /*placeholder for options.  */
data=''                                /*placeholder for data.     */

  do j=1 to words(aaa)
  x=word(aaa,j)
  if left(x,1)=='-' then opts=opts x   /*Option?  Then add to opts.*/
                    else data=data x   /*Must be data. Add to data.*/
  end

        /*the above process adds a leading blank to  OPTS and  DATA*/

opts=strip(opts,'L')                   /*strip leading blanks.     */
data=strip(data,'l')                   /*strip leading blanks.     */
say
say 'options='opts
say '   data='data
Note to users of Microsoft Windows and Regina REXX

Note that some REXX pass the command line as is, but Regina REXX lets the operating system parse it first (for instance Windows), and Windows will pass anything   (along to the program being invoked)   inside double quotes (") to the program as is.   Any other data not in double quotes is passed as is.

Output from Regina REXX under Windows with the invocation:

myprogram -c "alpha beta" -h "gamma"
command arguments:
-c alpha beta -h gamma

options=-c -h
   data=alpha beta gamma

Output from others REXXes under Windows with the invocation:

myprogram -c "alpha beta" -h "gamma"
command arguments:
-c "alpha beta" -h "gamma"

options=-c -h
   data="alpha beta" "gamma"


Notes to UNIX users

The rexx programming language does not preserve command line parameters containing spaces. This renders it unsuitable for use for wrapperscript applications, where filenames containing spaces need to be preserved, because there is no way to differentiate between a space within a parameter, and a space used to separate parameters.

Scenario

If a script is called as follows:

ccwrapper "foo bar.c" "bar bar.c"

From the shell:

argv[0] = ccwrapper
argv[1] = foo bar.c
argv[2] = bar bar.c

It is a requirement of a wrapper that !argv[1] and !argv[2] are preserved when passed to the target application (a C compiler, in this example). Current implementations of rexx treat the command line arguments as one long argument:

arg() = 1
arg(1) = "foo bar.c bar bar.c"

The [parser] would separates the command line arguments by spaces. this results in !argv[1] and !argv[2] becoming split, so the target application would be called with different arguments:

argv[1] = foo
argv[2] = bar.c
argv[3] = bar
argv[4] = bar.c

This has a different meaning to the compiler, so the arguments forwarded from rexx are rendered useless.

Workaround

A workaround would be to create a wrapper around the rexx interpreter that encodes the command-line before calling rexx. The rexx application then decodes it. Some rexx interpreters, such as regina also provide a !-a switch as a workaround.

Ring

see copy("=",30) + nl
see "Command Line Parameters" + nl
see "Size : " + len(sysargv) + nl
see sysargv
see copy("=",30) + nl
for x = 1 to len(sysargv)
    see x + nl
next

Ruby

Command line arguments are available in the constant Object::ARGV.

myprog:

#! /usr/bin/env ruby
p ARGV
 myprog a -h b c
 => ["a","-h","b","c"]

Rust

use std::env;

fn main(){
    let args: Vec<_> = env::args().collect();
    println!("{:?}", args);
}

Run:

./program -c "alpha beta" -h "gamma"
["./program", "-c", "alpha beta", "-h", "gamma"]

S-lang

The command-line arguments exist in the array __argv:

variable a;
foreach a (__argv)
  print(a);

Note 1: This array can be changed by calling

   __set_argc_argv(new_argv);

Note 2: When a script is run as a parameter to slsh, __argv does not include slsh. __argv[0] is simply the name of the script.

The same is true if running a script via the editor jed, as in:

   jed -script FILE [arg ...]

However, when [x/w]jed is entered normally, __argv consists of the command-line for the editor itself, with __argv[0] == jed or /path/to/jed or the equivalent.

Sather

class MAIN is
  main(args:ARRAY{STR}) is
    loop
      #OUT + args.elt! + "\n";
    end;
  end;
end;

As in C (and others), the first element is the command itself (exactly as it is written in the command line and after shell variable expansion); e.g.

$ /home/home/rosetta/sather/a.out arg1 arg2 arg3

prints

/home/home/rosetta/sather/a.out
arg1
arg2
arg3

Scala

Library: Scala

Calling Scala from command line means invoking a method called main, defined on an object, whose type is (Array[String]):Unit, meaning it receives an array of strings, and returns unit. That array contains the command line arguments.

object CommandLineArguments extends App { 
    println(s"Received the following arguments: + ${args.mkString("", ", ", ".")}")
}

When running a Scala script, where the whole body is executed, the arguments get stored in an array of strings called argv:

println(s"Received the following arguments: + ${argv.mkString("", ", ", ".")}")

Scheme

 (define (main args)
  (for-each (lambda (arg) (display arg) (newline)) args))

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;

Sidef

Command line arguments are available in the ARGV array.

say ARGV;
Output:
% myprog -c "alpha beta" -h "gamma"
['-c', 'alpha beta', '-h', 'gamma']

Slate

StartupArguments do: [| :arg | inform: arg]

Slope

Command line arguments are available in the sys-args list.

(display sys-args)

Smalltalk

Works with: GNU Smalltalk
(1 to: Smalltalk getArgc) do: [ :i |
  (Smalltalk getArgv: i) displayNl
]
Works with: Smalltalk/X
Smalltalk commandLineArguments printCR.
Smalltalk commandLineArguments do:[:each | each printCR]

SparForte

As a structured script.

#!/usr/local/bin/spar
pragma annotate( summary, "printargs" )
              @( description, "Retrieve the list of command-line arguments given to the program." )
              @( description, "Example command line: " )
              @( description, "myprogram -c 'alpha beta' -h 'gamma'" )
              @( category, "tutorials" )
              @( author, "Ken O. Burtch" )
              @( see_also, "http://rosettacode.org/wiki/Command-line_arguments" );
pragma license( unrestricted );

pragma software_model( nonstandard );
pragma restriction( no_external_commands );

procedure printargs is
begin
   put_line( "The command is '" & command_line.command_name & "'" );
   for Arg in 1..command_line.argument_count loop
      put( "Argument" ) @ (Arg ) @ ( " is '" ) @
         ( command_line.argument(Arg) ) @ ("'");
      new_line;
   end loop;
end printargs;

Standard ML

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);

Swift

let args = Process.arguments
println("This program is named \(args[0]).")
println("There are \(args.count-1) arguments.")
for i in 1..<args.count {
  println("the argument #\(i) is \(args[i])")
}

Alternately:

Works with: Swift version 1.2+
println("This program is named \(String.fromCString(Process.unsafeArgv[0])!).")
println("There are \(Process.argc-1) arguments.")
for i in 1 ..< Int(Process.argc) {
  println("the argument #\(i) is \(String.fromCString(Process.unsafeArgv[i])!)")
}
Works with: Swift version 1.0-1.1
println("This program is named \(String.fromCString(C_ARGV[0])!).")
println("There are \(C_ARGC-1) arguments.")
for i in 1 ..< Int(C_ARGC) {
  println("the argument #\(i) is \(String.fromCString(C_ARGV[i])!)")
}

Tailspin

$ARGS -> !OUT::write
Output:
[-c, alpha beta, -h, gamma]

TAV

The main function receives a row of string as first parameter, system options removed. The original is available at '$SYSTEM.parms'

main (parms):+
  ?# i =: give keys parms
      print i __ parms[i]
Output:
0 ./printparms
1 1
2 two
3 3.4

Tcl

The predefined global variable argc contains the number of arguments passed to the program after the script being executed, argv contains those arguments as a list. (The name of the script is in the argv0 global variable, and the name of the executable interpreter itself is returned by the command info nameofexecutable.) Retrieving the second argument might look something like this:

if { $argc > 1 } {
    puts [lindex $argv 1]
}

(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.

[ arglist array.get type cr ] is show-arg
[ dup . char: = emit space ] is #= 
1 #args [ i #= show-arg ] countedLoop


Transd

#lang transd

MainModule: {
	_start: (λ 
        (textout "Number of arguments: " @numArgs
                 "\nArgument list: " @progArgs)
    )
}

Linux command ('tree3' is the name of Transd interpreter):

 tree3 progname -c "alpha beta" -h "gamma"
Output:
Number of arguments: 5
Argument list: ["progname", "-c", "alpha beta", "-h", "gamma"]

TXR

Command line arguments in TXR's pattern-based extraction language can be treated as the lines of a text stream, which is arranged using the directive @(next :args). Thus TXR's text parsing capabilities work over the argument list.

This @(next :args) should be written as the first line of the TXR program, because TXR otherwise interprets the first argument as the name of an input file to open.

@(next :args)
@(collect)
@arg
@(end)
@(output)
My args are: {@(rep)@arg, @(last)@arg@(end)}
@(end)
$ ./txr args.txr
My args are: {}
$ ./txr args.txr 1
My args are: {1}
$ ./txr args.txr 1 2 3
My args are: {1, 2, 3}

Arguments are also available via two predefined variables: *full-args* and *args*, which are lists of strings, such that *args* is a suffic of *full-args*. *full-args* includes the arguments that were processed by TXR itself; *args* omits them.

Here is an example program which requires exactly three arguments. Note how ldiff is used to compute the arguments that are processed by TXR (the interpreter name, any special arguments and script name), to print an accurate usage message.

(tree-case *args*
  ((a b c) (put-line "got three args, thanks!"))
  (else (put-line `usage: @(ldiff *full-args* *args*) <arg1> <arg2> <arg3>`)))
Output:
$ txr command-line-args.txr 1 2
usage: txr command-line-args.txr <arg1> <arg2> <arg3>
$ txr command-line-args.txr 1 2 3 4
usage: txr command-line-args.txr <arg1> <arg2> <arg3>
$ txr command-line-args.txr 1 2 3
got three args, thanks!

UNIX Shell

Bourne Shell

To retrieve the entire list of arguments:

WHOLELIST="$@"

To retrieve the second and fifth arguments:

SECOND=$2
FIFTH=$5

Ursa

In Ursa, all command line arguments (including the program name as invoked) are contained in the string stream args.

#
# command-line arguments
#

# output all arguments
for (decl int i) (< i (size args)) (inc i)
        out args<i> endl console
end for

Sample shell session in the Bourne shell:

$ ursa cmdlineargs.u "alpha beta" -h "gamma"
cmdlineargs.u
alpha beta
-h
gamma
$

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.

#import std

#executable ('parameterized','')

clarg = <.file$[contents: --<''>+ _option%LP]>+ ~command.options

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

$stack puts

./args.v a b c
=[args.v a b c]

vbScript

'Command line arguments can be accessed all together by

For Each arg In Wscript.Arguments
    Wscript.Echo "arg=", arg
Next

'You can access only the named arguments such as /arg:value

For Each arg In Wscript.Arguments.Named
    Wscript.Echo "name=", arg, "value=", Wscript.Arguments.Named(arg)
Next

'Or just the unnamed arguments

For Each arg In Wscript.Arguments.Unnamed
    Wscript.Echo "arg=", arg
Next

Visual Basic

Like Qbasic, Visual Basic returns all of the args in the built-in variable Command$:

Sub Main
    MsgBox Command$
End Sub

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.

Sub Main(ByVal args As String())
    For Each token In args
        Console.WriteLine(token)
    Next
End Sub

V (Vlang)

This assumes that the following script, myscript.v, is run as follows: $ v run myscript.v -c "alpha beta" -h "gamma"

import os
 
fn main() {
	for i, x in os.args[1..] {
		println("the argument #$i is $x")
	}
}
Output:
the argument #0 is -c
the argument #1 is alpha beta
the argument #2 is -h
the argument #3 is gamma

Wren

This assumes that the following script, Command-line_arguments.wren, is run as follows: $ wren Command-line_arguments.wren -c "alpha beta" -h "gamma"

import "os" for Process

System.print(Process.arguments)
Output:
[-c, alpha beta, -h, gamma]

x86-64 Assembly

There are a few ways to access the command line arguments depending on how the program is linked. If the program is linked with the C libraries in Linux, the arguments are passed as parameters to the function main through registers. Just like how it's done in C. argc is passed in rdi and argv[] is passed in rsi and is a pointer to an array of pointers to zero terminated strings.

If statically linked in Linux, the command line arguments are pushed onto the stack last to first with argc pushed last. They can be accessed by popping off of the stack or by referencing rsp.

qword[rsp + 0]:    long argc;
qword[rsp + 8]:    char *arg1;
qword[rsp + 16]:   char *arg2;
qword[rsp + 24]:   char *arg3;
...

fasm

format ELF64 executable 3
entry start

segment executable readable
start:
    pop    rax         ; pop argc off stack. It should be at least 1
 .loop0:
    pop    rdi         ; pop the pointer to argument string off stack
    call prints        ; call a function to print a string
    mov    rdi, 0x0a   ; parameter to next function. 0x0a = line feed = 10
    call printc        ; call a function to print a single character
    dec    rax         ; decrement RAX.
    jnz    .loop0      ; get next argument if RAX is not yet 0
 .exit:
    mov    rax, 60
    mov    rdi, 0
    syscall

prints:                ; function that prints a zero terminated string
    push rax
    push rdi
    push rsi
    push rdx
    xor  rdx, rdx
    cmp  byte [rdi + rdx], 0
    je   .return
  .stloop:
    cmp  byte [rdi + rdx], 0
    je   .printit
    inc  rdx
    jmp  .stloop
  .printit:
    mov rax, 1
    mov rsi, rdi
    mov rdi, 1
    syscall
  .return:
    pop  rdx
    pop  rsi
    pop  rdi
    pop  rax
    ret

printc:              ;function that prints a single character in rdi (dil).
    push rax
    push rsi
    push rdx
    push rdi
    mov  rax, 1
    mov  rdi, 1
    mov  rsi, rsp
    mov  rdx, 1
    syscall
    pop  rdi
    pop  rdx
    pop  rsi
    pop  rax
    ret
Output:
$ fasm myprogram.asm myprogram
flat assembler  version 1.73.30  (16384 kilobytes memory)
2 passes, 243 bytes.
$ chmod 755 myprogram
$ ./myprogram -c "alpha beta" -h "gamma"
./myprogram
-c
alpha beta
-h
gamma
$ 

XPL0

Characters following the program name are copied into a buffer that is accessible as device 8. This displays the example command line with quote marks stripped off.

int C;
[loop   [C:= ChIn(8);
        if C = \EOF\$1A then quit;
        ChOut(0, C);
        ];
CrLf(0);
]
Output:
-c alpha beta -h gamma 

zkl

File myprogram.zkl:

System.argv.println();
vm.arglist.println();

zkl myprogram -c "alpha beta" -h "gamma"

Output:
L("/home/craigd/Projects/ZKL/Bin/zkl","myprogram","-c","alpha beta","-h","gamma")
L("-c","alpha beta","-h","gamma")
Cookies help us deliver our services. By using our services, you agree to our use of cookies.