${@vname} Expands to the type name (See Type Variables  below) or attributes of the variable referred to by vname. ${$parameter} If $parameter expands to the name of a variable, this expands to the value of that variable.  Otherwise, it expands to the empty string.  It is undefined for special parameters. ${!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 separate argument. When subscript is of the form sub1 ..  sub2 it expands to the list of subscripts between sub1 and sub2 inclusive 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 parameters 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 interactive).  If word is omitted then a standard message is printed. ${parameter:+word} If parameter is set and is non-null then substitute word; otherwise substitute nothing. In the above, word is not evaluated unless it is to be used as the substituted 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 negative 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 elements 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 smallest 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.