有一些腳本是根據文件名進行各類處理的。 shell所具備的一些內建功能能夠依據不一樣的狀況來切分文件名。shell
藉助%操做符能夠輕鬆的將名稱部分從"名稱.擴展名"這種格式中提取出來。能夠按照下面的方法從list.txt中提取名稱。google
# file_name="list.txt" # name=${file_name%.*} # echo File name is: $name 輸出結果:File name is: list
下一個是將文件名的擴展名部分提取出來,這能夠藉助#操做符實現。code
# name=${file_name#*.} # echo Extension is: $name 輸出結果:Extension is txt
工做原理: 在第一個任務裏,爲了從"名稱.擴展名"這個格式中提取名稱,咱們使用了%操做符。字符串
${VAR%.*} 的含義以下:域名
從$VAR中刪除位於%右側的通配符(在前例中是.*)全部匹配的字符串。通配符從右向左進行匹配。io
給$VAR賦值,VAR="list.txt"。那麼,通配符從右向左就會匹配到.txt,所以,從$VAR中刪匹配的結果,就會獲得輸出list變量
%屬於非貪婪操做,它從右到左找出匹配通配符最短的結果。還有另一個操做符%%,這個操做符與%類似,可是它的行爲模式倒是貪婪的,這說明它會匹配符合條件的最長的字符。原理
好比,咱們有這樣一個文件:擴展
# VAR="hack.fun.book.txt" # echo ${VAR%.*} 輸出結果:hack.fun.book
操做符%使用.*從右到左執行非貪婪匹配(.txt)file
使用%%操做符:
# echo ${VAR%%.*} 輸出結果:hack
操做符%%使用.*從右到左執行貪婪匹配(.fun.book.txt)
在第二個任務中,咱們用#操做符從文件名中提取擴展名。這個操做與%相似,不過求值方向是從左到右。
${VAR#*.}的含義以下:
從$VAR中刪除位於#右側的通配符(即在前例中使用的*.)所匹配的字符串。通配符從左向右進行匹配。
和%%相似,#也有一個貪婪操做符##
##從左向右進行貪婪匹配,並從指定變量中刪除匹配結果。
來看一個例子:
# VAR="hack.fun.book.txt"
使用#操做符:(非貪婪)
# echo ${VAR#*.} 輸出結果:fun.book.txt
使用##操做符:(貪婪)
# echo ${VAR##*.} 輸出結果:.txt
注意:
由於文件名中可能包含多個'.'字符,因此相較於#,##更適合從文件名中提取擴展名。##執行的是貪婪匹配,所以老是可以準確的提取出擴展名。
這裏咱們使用一個域名來作個總結:URL="www.google.com"
# echo ${URL%.*} #移除.*所匹配的最右邊的內容 輸出:www.google # echo ${URL%%.*} #將從右邊開始一直匹配到最左邊的.*移除(貪婪操做符) 輸出:www # echo ${URL#*.} #移除*.所匹配的最左邊內容 輸出:google.com #echo ${URL##*.} #將從左邊開始一直匹配到最右邊的*.移除(貪婪操做符) 輸出:com