#!/bin/bash
#
count=1
for asf in *.mp3
do
new=${asf%_*}.${asf#*.}
echo $new
let count++
done
 
-----------------------------------------------
 
借助 % # 操作符可以轻松的解析 " 名称 . 扩展名 " 这种格式的文件名字。
 
1
;file_jpg="sample.jpg"
;name=${file_jpg%.*}
Echo FIle name is:$name
 
输出结果为:  File name is : sample
 
2
;extension=${file_jpg#*.}
;echo Extension is : $extension
 
输出结果是: Extension is : jpg
 
工作原理:
 
第一个任务中,为了从“名称。扩展名”这种格式文件名中提取名称,我们用了 % 操作符。
${VAR%.*} 的含义是:
$VAR 中删除位于 % 右侧的通配符(在例 1 中是 .* )所匹配的字符串。通配符从右向左进行匹配。例 1 VAR 的值为 sample.jpg ,那么通配符从右向左匹配 .* 的话会匹配到 .jpg 。因此从 $VAR 中删除匹配结果,就得到了文件名 "sample"
 
% 属于非贪婪匹配操作。它从右到左找出匹配通配符的最短结果。
%% 属于贪婪匹配,所谓贪婪的意思就是会匹配符合条件的最长的字符串。匹配方向也是从右向左匹配。如果 $VAR 的值为 hack.fun.book.txt ,那么用贪婪匹配 ${VAR%%.*}, 则匹配到的结果为 hack
 
# 操作符也是非贪婪匹配,不过其匹配方向是从左向右。当然也是匹配最短结果。
${VAR#*.} 的含义是:
$VAR 中删除位于 # 右侧的通配符 ( 这里即 *.) 所匹配的字符串,匹配方向是从左向右。
## 则属于贪婪匹配,即从左向右匹配最长结果并删除匹配结果。
 
再举例说明下:
VAR=hack.fun.book.txt
使用 # 操作符:
$echo ${VAR#*.}
输出结果为 : fun.book.txt
使用 ## 操作符:
$ echo ${VAR##*.}
输出结果为  txt
 
练习: URL=www.google.cn   #echo  ${URL%.*} ${URL%%.*} ${URL#*.} ${URL##*.}