有些腳本要根據文件名進行各種處理,有時候需要保留文件名拋棄文件后綴,也有時候需要文件后綴不要文件名,這類提取文件部分的操作使用shell的內建功能就能實現。需要用到的幾個操作符有:%、%%、#、##。
從右向左匹配 :% 和 %% 操作符的示例
#!/bin/bash
#提取文件名,刪除后綴。
file_name="text.gif"
name=${file_name%.*}
echo file name is: $name
輸出結果:
file name is: test
# ${VAR%.* }含義:從$VAR中刪除位於 % 右側的通配符左右匹配的字符串,通配符從右向左進行匹配。現在給變量 name 賦值,name=text.gif,那么通配符從右向左就會匹配到 .gif,所有從 $VAR 中刪除匹配結果。
# % 屬於非貪婪操作符,他是從左右向左匹配最短結果;%% 屬於貪婪操作符,會從右向左匹配符合條件的最長字符串。
file_name="text.gif.bak.2012"
name=${file_name%.*}
name2=${file_name%%.*}
echo file name is: $name
echo file name is: $name2
輸出結果:
file name is: test.gif.bak //使用 %
file name is: test //使用 %%
操作符 %% 使用 .* 從右向左貪婪匹配到 .gif.bak.2012
從左向右匹配:# 和 ## 操作符示例
#!/bin/bash
#提取后綴,刪除文件名。
file_name="text.gif"
suffix=${file_name#*.}
echo suffix is: $suffix
輸出結果:
suffix is: gif
# ${VAR#*.} 含義:從 $VAR 中刪除位於 # 右側的通配符所匹配的字符串,通配符是左向右進行匹配。
# 跟 % 一樣,# 也有貪婪操作符 ## 。
file_name="text.gif.bak.2012.txt"
suffix=${file_name#*.}
suffix2=${file_name##*.}
echo suffix is: $suffix
echo suffix is: $suffix2
輸出結果:
suffix is: text.gif.bak.2012 //使用 #
suffix2 is: txt //使用 ##
操作符 ## 使用 *. 從左向右貪婪匹配到 text.gif.bak.2012
示例2,定義變量 url="www.1987.name"
echo ${url%.*} #移除 .* 所匹配的最右邊的內容。
www.1987
echo ${url%%.*} #將從右邊開始一直匹配到最左邊的 *. 移除,貪婪操作符。
www
echo ${url#*.} #移除 *. 所有匹配的最左邊的內容。
1987.name
echo ${url##*.} #將從左邊開始一直匹配到最右邊的 *. 移除,貪婪操作符。
name
