#!/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中是.*)所匹配的字符串。通配符从右向左进行匹配。例1VAR的值为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##*.}