parameter expansion exercises

what is the meaning of:

${parameter#word}

 

what about the special case:

 ${parameter#?}

 

what is the meaning of:

${parameter%word}

 

what about the special case:

 ${parameter%${parameter#?}}

 

Try it by setting a variable ("parameter") to a value, like abcde and experimenting.

 

For reference, the Parmeter Expansion section of the bash man page:

   Parameter Expansion
       The `$' character introduces parameter expansion, command  substitu-
       tion,  or  arithmetic expansion.	 The parameter name or symbol to be
       expanded may be enclosed in braces, which are optional but serve	 to
       protect the variable to be expanded from characters immediately fol-
       lowing it which could be interpreted as part of the name.

       When braces are used, the matching ending brace is the first `}' not
       escaped	by a backslash or within a quoted string, and not within an
       embedded arithmetic expansion, command  substitution,  or  parameter
       expansion.

       ${parameter}
	      The  value  of  parameter	 is  substituted.   The	 braces are
	      required when parameter is a positional parameter	 with  more
	      than  one digit, or when parameter is followed by a character
	      which is not to be interpreted as part of its name.

       If the first character of parameter is an exclamation point  (!),  a
       level of variable indirection is introduced.  Bash uses the value of
       the variable formed from the rest of parameter as the  name  of	the
       variable;  this	variable is then expanded and that value is used in
       the rest of the substitution, rather than  the  value  of  parameter
       itself.	 This  is  known  as indirect expansion.  The exceptions to
       this are the expansions of  ${!prefix*}	and  ${!name[@]}  described
       below.  The exclamation point must immediately follow the left brace
       in order to introduce indirection.

       In each of the cases below, word	 is  subject  to  tilde	 expansion,
       parameter expansion, command substitution, and arithmetic expansion.

       When  not performing substring expansion, using the forms documented
       below, bash tests for a parameter that is unset or  null.   Omitting
       the colon results in a test only for a parameter that is unset.

       ${parameter:-word}
	      Use  Default  Values.   If  parameter  is	 unset or null, the
	      expansion of word is substituted.	 Otherwise,  the  value	 of
	      parameter is substituted.
       ${parameter:=word}
	      Assign  Default  Values.	 If parameter is unset or null, the
	      expansion of word is assigned to	parameter.   The  value	 of
	      parameter	 is  then  substituted.	  Positional parameters and
	      special parameters may not be assigned to in this way.
       ${parameter:?word}
	      Display Error if Null or Unset.	If  parameter  is  null	 or
	      unset,  the expansion of word (or a message to that effect if
	      word is not present) is written to the standard error and the
	      shell, if it is not interactive, exits.  Otherwise, the value
	      of parameter is substituted.
       ${parameter:+word}
	      Use Alternate Value.  If parameter is null or unset,  nothing
	      is  substituted,	otherwise  the expansion of word is substi-
	      tuted.
       ${parameter:offset}
       ${parameter:offset:length}
	      Substring Expansion.  Expands to up to length  characters	 of
	      parameter	 starting at the character specified by offset.	 If
	      length is omitted, expands  to  the  substring  of  parameter
	      starting	at  the	 character specified by offset.	 length and
	      offset are arithmetic expressions (see ARITHMETIC	 EVALUATION
	      below).	If offset evaluates to a number less than zero, the
	      value is used as an offset from  the  end	 of  the  value	 of
	      parameter.   If  length evaluates to a number less than zero,
	      and parameter is not @ and  not  an  indexed  or	associative
	      array,  it  is  interpreted  as an offset from the end of the
	      value of parameter rather than a number  of  characters,	and
	      the  expansion is the characters between the two offsets.	 If
	      parameter is @, the result is  length  positional	 parameters
	      beginning	 at  offset.  If parameter is an indexed array name
	      subscripted by @ or *, the result is the	length	members	 of
	      the  array  beginning  with ${parameter[offset]}.	 A negative
	      offset is taken relative to  one	greater	 than  the  maximum
	      index of the specified array.  Substring expansion applied to
	      an associative array produces undefined results.	Note that a
	      negative	offset must be separated from the colon by at least
	      one space to avoid being	confused  with	the  :-	 expansion.
	      Substring indexing is zero-based unless the positional param-
	      eters are used, in which case the indexing  starts  at  1	 by
	      default.	 If  offset is 0, and the positional parameters are
	      used, $0 is prefixed to the list.

       ${!prefix*}
       ${!prefix@}
	      Names matching prefix.  Expands to  the  names  of  variables
	      whose names begin with prefix, separated by the first charac-
	      ter of the IFS special variable.	When  @	 is  used  and	the
	      expansion	 appears  within  double quotes, each variable name
	      expands to a separate word.

       ${!name[@]}
       ${!name[*]}
	      List of array keys.  If name is an array variable, expands to
	      the  list	 of array indices (keys) assigned in name.  If name
	      is not an array, expands to 0 if name is set and null  other-
	      wise.  When @ is used and the expansion appears within double
	      quotes, each key expands to a separate word.

       ${#parameter}
	      Parameter length.	 The length in characters of the  value	 of
	      parameter	 is substituted.  If parameter is * or @, the value
	      substituted is  the  number  of  positional  parameters.	 If
	      parameter	 is  an array name subscripted by * or @, the value
	      substituted is the number of elements in the array.

       ${parameter#word}
       ${parameter##word}
	      Remove matching prefix pattern.  The word is expanded to pro-
	      duce a pattern just as in pathname expansion.  If the pattern
	      matches the beginning of the value  of  parameter,  then	the
	      result  of  the  expansion is the expanded value of parameter
	      with the shortest matching pattern (the ``#''  case)  or	the
	      longest  matching	 pattern  (the	``##''	case)  deleted.	 If
	      parameter is @ or *, the pattern removal operation is applied
	      to  each	positional  parameter in turn, and the expansion is
	      the resultant list.  If parameter is an array  variable  sub-
	      scripted	with  @	 or  *,	 the  pattern  removal operation is
	      applied to each member of the array in turn, and	the  expan-
	      sion is the resultant list.

       ${parameter%word}
       ${parameter%%word}
	      Remove matching suffix pattern.  The word is expanded to pro-
	      duce a pattern just as in pathname expansion.  If the pattern
	      matches  a  trailing portion of the expanded value of parame-
	      ter, then the result of the expansion is the  expanded  value
	      of  parameter  with  the shortest matching pattern (the ``%''
	      case) or the  longest  matching  pattern	(the  ``%%''  case)
	      deleted.	 If parameter is @ or *, the pattern removal opera-
	      tion is applied to each positional parameter in turn, and the
	      expansion	 is  the  resultant list.  If parameter is an array
	      variable subscripted with @ or *, the pattern removal  opera-
	      tion  is applied to each member of the array in turn, and the
	      expansion is the resultant list.

       ${parameter/pattern/string}
	      Pattern substitution.  The pattern is expanded to	 produce  a
	      pattern just as in pathname expansion.  Parameter is expanded
	      and the  longest	match  of  pattern  against  its  value	 is
	      replaced	with string.  If pattern begins with /, all matches
	      of pattern are replaced with string.  Normally only the first
	      match  is	 replaced.  If pattern begins with #, it must match
	      at the beginning of the expanded value of parameter.  If pat-
	      tern  begins with %, it must match at the end of the expanded
	      value of parameter.  If string is null,  matches	of  pattern
	      are  deleted  and the / following pattern may be omitted.	 If
	      parameter is @ or *, the substitution operation is applied to
	      each  positional	parameter in turn, and the expansion is the
	      resultant list.  If  parameter  is  an  array  variable  sub-
	      scripted	with  @ or *, the substitution operation is applied
	      to each member of the array in turn, and the expansion is the
	      resultant list.

       ${parameter^pattern}
       ${parameter^^pattern}
       ${parameter,pattern}
       ${parameter,,pattern}
	      Case  modification.   This  expansion  modifies  the  case of
	      alphabetic characters in parameter.  The pattern is  expanded
	      to  produce  a  pattern just as in pathname expansion.  The ^
	      operator	converts  lowercase  letters  matching	pattern	 to
	      uppercase; the , operator converts matching uppercase letters
	      to lowercase.  The ^^ and ,, expansions convert each  matched
	      character in the expanded value; the ^ and , expansions match
	      and convert only the first character in the  expanded  value.
	      If  pattern is omitted, it is treated like a ?, which matches
	      every character.	If parameter is @ or *, the case  modifica-
	      tion  operation  is  applied  to each positional parameter in
	      turn, and the expansion is the resultant list.  If  parameter
	      is  an array variable subscripted with @ or *, the case modi-
	      fication operation is applied to each member of the array	 in
	      turn, and the expansion is the resultant list.