Code:
${parameter}
The shell reads all the characters from ${ to the matching } as
part of the same word even if it contains braces or metacharac-
ters. The value, if any, of the parameter is substituted. The
braces are required when parameter is followed by a letter,
digit, or underscore that is not to be interpreted as part of
its name, when the variable name contains a .. The braces are
also required when a variable is subscripted unless it is part
of an Arithmetic Expression or a Conditional Expression. If
parameter is one or more digits then it is a positional parame-
ter. A positional parameter of more than one digit must be
enclosed in braces. If parameter is * or @, then all the posi-
tional parameters, starting with $1, are substituted (separated
by a field separator character). If an array vname with sub-
script * @, or of the form sub1 .. sub2. is used, then the
value for each of the elements between sub1 and sub2 inclusive
(or all elements for * and @) is substituted, separated by the
first character of the value of IFS.
${#parameter}
If parameter is * or @, the number of positional parameters is
substituted. Otherwise, the length of the value of the parame-
ter is substituted.
${#vname[*]}
${#vname[@]}
The number of elements in the array vname is substituted.
${@vname}
Expands to the type name (See Type Variables below) or
attributes of the variable referred to by vname.
${!vname}
Expands to the name of the variable referred to by vname. This
will be vname except when vname is a name reference.
${!vname[subscript]}
Expands to name of the subscript unless subscript is *, @. or
of the form sub1 .. sub2. When subscript is *, the list of
array subscripts for vname is generated. For a variable that is
not an array, the value is 0 if the variable is set. Otherwise
it is null. When subscript is @, same as above, except that
when used in double quotes, each array subscript yields a sepa-
rate argument. When subscript is of the form sub1 .. sub2 it
expands to the list of subscripts between sub1 and sub2 inclu-
sive using the same quoting rules as @.
${!prefix*}
Expands to the names of the variables whose names begin with
prefix.
${parameter:-word}
If parameter is set and is non-null then substitute its value;
otherwise substitute word.
${parameter:=word}
If parameter is not set or is null then set it to word; the
value of the parameter is then substituted. Positional parame-
ters may not be assigned to in this way.
${parameter:?word}
If parameter is set and is non-null then substitute its value;
otherwise, print word and exit from the shell (if not interac-
tive). If word is omitted then a standard message is printed.
${parameter:+word}
If parameter is set and is non-null then substitute word; other-
wise substitute nothing.
In the above, word is not evaluated unless it is to be used as the sub-
stituted string, so that, in the following example, pwd is executed
only if d is not set or is null:
print ${d:-$(pwd)}
If the colon ( : ) is omitted from the above expressions, then the
shell only checks whether parameter is set or not.
${parameter:offset:length}
${parameter:offset}
Expands to the portion of the value of parameter starting at the
character (counting from 0) determined by expanding offset as an
arithmetic expression and consisting of the number of characters
determined by the arithmetic expression defined by length. In
the second form, the remainder of the value is used. If A nega-
tive offset counts backwards from the end of parameter. Note
that one or more blanks is required in front of a minus sign to
prevent the shell from interpreting the operator as :-. If
parameter is * or @, or is an array name indexed by * or @, then
offset and length refer to the array index and number of ele-
ments respectively. A negative offset is taken relative to one
greater than the highest subscript for indexed arrays. The
order for associate arrays is unspecified.
${parameter#pattern}
${parameter##pattern}
If the shell pattern matches the beginning of the value of
parameter, then the value of this expansion is the value of the
parameter with the matched portion deleted; otherwise the value
of this parameter is substituted. In the first form the small-
est matching pattern is deleted and in the second form the
largest matching pattern is deleted. When parameter is @, *, or
an array variable with subscript @ or *, the substring operation
is applied to each element in turn.
${parameter%pattern}
${parameter%%pattern}
If the shell pattern matches the end of the value of parameter,
then the value of this expansion is the value of the parameter
with the matched part deleted; otherwise substitute the value of
parameter. In the first form the smallest matching pattern is
deleted and in the second form the largest matching pattern is
deleted. When parameter is @, *, or an array variable with sub-
script @ or *, the substring operation is applied to each ele-
ment in turn.
${parameter/pattern/string}
${parameter//pattern/string}
${parameter/#pattern/string}
${parameter/%pattern/string}
Expands parameter and replaces the longest match of pattern with
the given string. Each occurrence of \n in string is replaced
by the portion of parameter that matches the n-th sub-pattern.
In the first form, only the first occurrence of pattern is
replaced. In the second form, each match for pattern is
replaced by the given string. The third form restricts the pat-
tern match to the beginning of the string while the fourth form
restricts the pattern match to the end of the string. When
string is null, the pattern will be deleted and the / in front
of string may be omitted. When parameter is @, *, or an array
variable with subscript @ or *, the substitution operation is
applied to each element in turn. In this case, the string por-
tion of word will be re-evaluated for each element.