The C shell's string editing operators ( 9.6 ) can be used with shell variables and, in some cases, with command history. Those operators also work with bash history. But the Korn shell and bash have a different way to edit shell variables. Table 9.1 shows them:
Operator | Explanation |
---|---|
${ variable # pattern } |
Delete the shortest part of pattern that matches the beginning of variable 's value. Return the rest. |
${ variable ## pattern } |
Delete the longest part of pattern that matches the beginning of variable 's value. Return the rest. |
${ variable % pattern } |
Delete the shortest part of pattern that matches the end of variable 's value.Return the rest. |
${ variable %% pattern } |
Delete the longest part of pattern that matches the end of variable 's value.Return the rest. |
The
pattern
s can be filename wildcard characters:
*
,
?
, and
[]
; with string editing operators, wildcards match strings in the same way they match filenames. (These are not
sed
-like regular expressions.) The first two operators, with
#
, edit variables from the front. The other two, with
%
, edit from the end. Here's a system for remembering which does what: you put a number sign (
#
) at the
front
of a number and a percent sign (
%
) at the
end
of a number.
Time for some examples. The variable var contains /a/b/c/d/e.f.g :
Expression Result ${var} /a/b/c/d/e.f.g ${var#/*/} b/c/d/e.f.g ${var##/*/} e.f.g ${var%.*} /a/b/c/d/e.f ${var%%.*} /a/b/c/d/e ${var%%/*/} /a/b/c/d/e.f.g ${var%%/*} ${var%/b*} /a ${var%%/b*} /a
How about a practical example? The
PATH
variable (
6.4
)
is a string separated by colons (
:
). Let's say you want to remove the last directory from the system path and add
$HOME/bin
in place of the last directory. You'd type this command, or put a line like this in your
.profile
:
PATH=${PATH%:*}:$HOME/bin
Because the
${PATH%:*}
has a single
%
, that operator removes the least it can: just the last colon plus the directory name after it. After string editing, the rest of the
PATH
has
:$HOME/bin
appended to it. The new value is saved as the new
PATH
.
The Bourne shell's parameter substitution operators ( 45.12 ) look similar, but they're mostly useful for shell programming.
-