A no-frills guide to the Bash shell's variable syntax.
Shell variables are created and assigned using =
.
foo=value bar="value with spaces"
No spaces are allowed on either side of the =
.
Values are accessed using a $
, optionally with braces to disambiguate the variable name: $foo
or ${foo}
. Undefined variables evaluate to the empty string ""
.
Variables are local to the shell instance by default, but can be exported to become environment variables visible to subshells and subprocesses.
FOO=value BAR=value export FOO BAR
Environment variables can be created and exported on a single line.
export BAZ=value
Environment variables are traditionally given capslocked names.
Positional parameters are automatically defined variables that hold the command line arguments to scripts. They have the names 1
, 2
, 3
, etc, so their values are denoted by $1
, $2
, $3
, etc. Parameter 0
holds the name of the script itself.
Two special, confusingly-similar variables contain all of the positional parameters except 0
— *
and @
. The difference between them is only apparent when they are inside double quotes.
"$*"
is a single string containing all of the positional parameters separated by the first character of the IFS
environment variable (typically a space), i.e.
"$1 $2 $3 ... $N"
"$@"
is a list of separate double-quoted strings separated by spaces, i.e.
"$1" "$2" "$3" ... "$N"
A final automatic variable #
stores the number of arguments.
Functions have their own local set of positional parameters and automatic variables, just like scripts. The only point to note is that parameter 0
inside a function still refers to the script name, not the function name.
All other function variables are global by default. Defining or altering a variable within a function defines or alters that variable throughout the shell instance.
Local variables can be declared with the local
keyword.
local foo bar=value baz="other value"
Local variables are visible only within their defining function and its children, i.e. functions called by the defining function.
The following string operators can be used inside braces.
${name-default}
|
Returns $name if the variable exists; otherwise returns default.
|
${name:-default}
|
Returns $name if the variable exists and is not empty; otherwise returns default.
|
${name=default}
|
Returns $name if the variable exists; otherwise sets name to default and returns the value.
|
${name:=default}
|
Returns $name if the variable exists and is not empty; otherwise sets name to default and returns the value.
|
${name:offset:len}
|
Returns the substring of name starting at offset and up to len characters. If len is omitted, the substring continues to the end of name .
|
${name#pattern}
|
If pattern matches the beginning of $name , deletes the shortest part that matches and returns the rest.
|
${name##pattern}
|
If pattern matches the beginning of $name , deletes the longest part that matches and returns the rest.
|
${name%pattern}
|
If pattern matches the end of $name , deletes the shortest part that matches and returns the rest.
|
${name%%pattern}
|
If pattern matches the end of $name , deletes the longest part that matches and returns the rest.
|
${name/pattern/str}
|
Replaces the first match to pattern with str .
|
${name//pattern/str}
|
Replaces all matches to pattern with str .
|
${#name}
|
Returns the length of $name .
|
Command substitution treats the output of a command as if it were the value of a variable.
$(command arg arg...)
The command is run in a subshell and its standard output, stripped of any trailing newlines, is returned as the value of the expression.
Command substitutions can be nested.