How-to: Command line arguments - bash

A command line argument (or parameter) is any value passed into a script on the command line:

$ ./ March 1234 "Some value"

A parameter is an entity that stores values. It can be a name, a number, or one of the special characters listed below.

A variable is a parameter denoted by a name. A variable has a value and zero or more attributes. Attributes are assigned using declare

A parameter is set if it has been assigned a value. The null string is a valid value. Once a variable is set, it may be unset only by using unset.

A variable may be assigned to by a statement of the form


If value is not given, the variable is assigned the null string. All values undergo tilde expansion,parameter and variable expansion, command substitution, arithmetic expansion, and quote removal (see EXPANSION ). If the variable has its integer attribute set, then value is evaluated as an arithmetic expression even if the $((...)) expansion is not used (see Arithmetic Expansion below).

Word splitting is not performed, with the exception of "$@" as explained below under Special Parameters. Pathname expansion is not performed. Assignment statements may also appear as arguments to the alias, declare, typeset, export, readonly, and local builtin commands.

In the context where an assignment statement is assigning a value to a shell variable or array index, the += operator can be used to append to or add to the variable's previous value. When += is applied to a variable for which the integer attribute has been set, value is evaluated as an arithmetic expression and added to the variable's current value, which is also evaluated. When += is applied to an array variable using compound assignment (see Arrays below), the variable's value is not unset (as it is when using =), and new values are appended to the array beginning at one greater than the array's maximum index. When applied to a string-valued variable, value is expanded and appended to
the variable's value.

Positional Parameters

A positional parameter is a parameter denoted by one or more digits, other than the single digit 0.
Positional parameters are assigned from the shell's arguments when it is invoked, and may be reassigned using the set builtin command. Positional parameters may not be assigned to with assignment statements. The positional parameters are temporarily replaced when a shell function is executed (see FUNCTIONS).
When a positional parameter consisting of more than a single digit is expanded, it must be enclosed in braces (see EXPANSION).

Special Parameters

The shell treats several parameters specially. These parameters may only be referenced; assignment to them is not allowed.

    *      Expands to the positional parameters, starting from one.  When  the  expansion  occurs  within
           double  quotes,  it expands to a single word with the value of each parameter separated by the
           first character of the IFS special variable.  That is,  "$*"  is  equivalent  to  "$1c$2c...",
           where c is the first character of the value of the IFS variable.  If IFS is unset, the parameters
           are separated by spaces.  If IFS is null, the parameters are joined  without  intervening

    @      Expands to the positional  parameters, starting from one. When the expansion occurs within
           double quotes, each parameter expands to a separate word. That is, "$@" is equivalent to "$1"
           "$2"  ...   If  the  double-quoted  expansion occurs within a word, the expansion of the first
           parameter is joined with the beginning part of the original word, and  the  expansion  of  the
           last  parameter  is  joined  with the last part of the original word.  When there are no positional
           parameters, "$@" and $@ expand to nothing (i.e., they are removed).

    #      Expands to the number of positional parameters in decimal.

    ?      Expands to the status of the most recently executed foreground pipeline.

    -      Expands to the current option flags as specified upon invocation, by the set builtin  command,
           or those set by the shell itself (such as the -i option).

    $      Expands to the process ID of the shell.  In a () subshell, it expands to the process ID of the
           current shell, not the subshell.

    !      Expands to the process ID of the most recently executed background (asynchronous) command.

    0      Expands to the name of the shell or shell script.  This is set at  shell  initialization.  
           If bash  is  invoked  with  a  file  of commands, $0 is set to the name of that file. 
           If bash is started with the -c option, then $0 is set to the first argument after the string to be
           executed,  if one is present. Otherwise, it is set to the file name used to invoke bash, as given
           by argument zero.

    _      At shell startup, set to the absolute pathname used to invoke the shell or shell script  being
           executed  as  passed  in  the environment or argument list.  Subsequently, expands to the last
           argument to the previous command, after expansion.  Also set to  the  full  pathname  used  to
           invoke  each  command  executed  and placed in the environment exported to that command.  When
           checking mail, this parameter holds the name of the mail file currently being checked.

Related macOS commands

macOS How To
How Command Line Parameters are Parsed by David Deley

Copyright © 1999-2023
Some rights reserved