*Linux:シェルスクリプトでパス文字列からファイル名/ディレクトリ名を抽出する [#g1c3bf59]
これは便利です!
実は簡単にシェルスクリプトでパス文字列からファイル名/ディレクトリ名を抽出できます。
サンプルは以下のとおり。
まず、サンプルのファイルのフルパスを変数に入れます。
# TARGET=/etc/sysconfig/network-scripts/ifcfg-eth0
#
# echo ${TARGET}
/etc/sysconfig/network-scripts/ifcfg-eth0
#
echoすると当然そのまま出ます。
ディレクトリ名を取り出す場合はこんな感じ。
# echo ${TARGET%/*}
/etc/sysconfig/network-scripts
おお!できた!
続いて、ファイル名だけ取り出す場合はこんな感じ。
# echo ${TARGET##*/}
ifcfg-eth0
おお!できた!
***解説 [#m5d278be]
>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.
> ${parameter}
> The value of parameter is substituted. The braces are required when parameter is a posi-
> tional 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 substitu-
> tion, rather than the value of parameter itself. This is known as indirect expansion. The excep-
> tions 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 sub-
> stitution, 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}
> 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 substituted.
> ${parameter:offset}
> ${parameter:offset:length}
> Substring Expansion. Expands to up to length characters of parameter starting at the char-
> acter 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 expres-
> sions (see ARITHMETIC EVALUATION below). 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]}. A
> negative offset is taken relative to one greater than the maximum index of the specified
> array. 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 parameters are used, in which case the indexing starts at 1.
> ${!prefix*}
> ${!prefix@}
> Expands to the names of variables whose names begin with prefix, separated by the first
> character of the IFS special variable.
> ${!name[@]}
> ${!name[*]}
> 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 otherwise. When @ is used
> and the expansion appears within double quotes, each key expands to a separate word.
> ${#parameter}
> 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}
> The word is expanded to produce 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 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 pathname expansion. If the pattern
> matches a trailing portion 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/pattern/string}
> 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
> Ipattern 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 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.