bash Parameter Expansion

65 views
Skip to first unread message

hq4...@gmail.com

unread,
Mar 28, 2005, 7:27:45 PM3/28/05
to bash...@googlegroups.com
************************
http://itb.biologie.hu-berlin.de/~benda/software/bash.html
************************

======================
File name manipulation
======================

Consider
FILE = ref/paper/some.ps.gz
then
${FILE#*/} returns the path with the first directory removed:
paper/some.ps.gz
${FILE##*/} returns the file name with the all directories removed:
some.ps.gz
$(basename $FILE) returns the file name with the all directories
removed: some.ps.gz
${FILE#*.} returns all extensions: ps.gz
${FILE##*.} returns the last extension: gz
${FILE%/*} returns the directories: ref/paper
$(dirname $FILE) returns the directories: ref/paper
${FILE%%/*} returns the first directory: ref
${FILE%.*} returns the path with the last extension removed:
ref/paper/some.ps
${FILE%%.*} returns the path with all extensions removed:
ref/paper/some
For details, see man bash: "Parameter Expansion", man basename, and man
dirname

Rename extension with ${FILE%%.*}.pdf.
If you also want to strip the leading directory parts use $(basename
$FILE .ps.gz).pdf


************************
Bash : Man Page
************************

=========================
Shell Parameter Expansion
=========================

The `$' character introduces parameter expansion, command substitution,
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 following 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.

The basic form of parameter expansion is ${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 that 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.

In each of the cases below, word is subject to tilde expansion,
parameter expansion, command substitution, and arithmetic expansion.
When not performing substring expansion, 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}
If parameter is unset or null, the expansion of word is
substituted. Otherwise, the value of parameter is substituted.
${parameter:=word}
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}
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}
If parameter is null or unset, nothing is substituted, otherwise
the expansion of word is substituted.
${parameter:offset}
${parameter:offset:length}
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 section Shell
Arithmetic). This is referred to as Substring Expansion. length must
evaluate to a number greater than or equal to zero. 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 parameter is `@', the result is length
positional parameters beginning at offset. If parameter is an array
name indexed by `@' or `*', the result is the length members of the
array beginning with ${parameter[offset]}. Substring indexing is
zero-based unless the positional parameters are used, in which case the
indexing starts at 1.
${#parameter}
The length in characters of the expanded 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}
The word is expanded to produce a pattern just as in filename
expansion (see section Filename Expansion). If the pattern matches the
beginning of the expanded 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 subscripted with `@'
or `*', the pattern removal operation is applied to each member of the
array in turn, and the expansion is the resultant list.
${parameter%word}
${parameter%%word}
The word is expanded to produce a pattern just as in filename
expansion. If the pattern matches a trailing portion of the expanded
value of parameter, then the result of the expansion is the 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 subscripted with `@' or `*', the pattern
removal operation is applied to each member of the array in turn, and
the expansion is the resultant list.
${parameter/pattern/string}
${parameter//pattern/string}
The pattern is expanded to produce a pattern just as in filename
expansion. Parameter is expanded and the longest match of pattern
against its value is replaced with string. In the first form, only the
first match is replaced. The second form causes all matches of pattern
to be replaced with string. If pattern begins with `#', it must match
at the beginning of the expanded value of parameter. If pattern 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
subscripted with `@' or `*', the substitution operation is applied to
each member of the array in turn, and the expansion is the resultant
list.

Reply all
Reply to author
Forward
0 new messages