var=/dir1/dir2/file.tar.gz
basename $var #獲取文件名
file.tar.gz
dirname $var #獲取目錄名稱
/dir1/dir2
dirname $(dirname $var) #獲取上級目錄的名稱
/dir1
echo ${var##*/} #刪除左起最后一個/及其左邊的字符串
file.tar.gz
echo ${var##*.} #刪除左起最后一個.及其左邊的字符串
gz
echo ${var #*.} #刪除左起第一個.及其左邊的字符串
tar.gz
echo ${var%/*} #刪除右起第一個/及右邊的字符
/dir1/dir2
echo ${var%%.*} #刪除右起最后一個.及右邊的字符
/dir1dir2/file
echo ${#var} #等價於 echo -n $var | wc -c ,求字符串長度
22
echo ${var:0:5} #兩個數字分別為起始地址和截取長度
/dir1
echo ${var/dir/path} #替換第一個dir為path
/path1/dir2/file.tar.gz
echo ${var//dir/path} #替換左右dir為path
/path1/path2/file.tar.gz
${}並不是專門為提取文件名或目錄名的,它的使用是變量的提取和替換等等操作,它可以提取非常多的內容,並不一定是上面五個例子中的'/'或'.'。也就是說,上面的使用方法只是它使用的一個特例。
看到上面的這些命令,可能會讓人感到非常難以理解和記憶,其實不然,它們都是有規律的。
#:表示從左邊算起第一個
%:表示從右邊算起第一個
##:表示從左邊算起最后一個
%%:表示從右邊算起最后一個
換句話來說,#總是表示左邊算起,%總是表示右邊算起。
*:表示要刪除的內容,對於#和##的情況,它位於指定的字符(例子中的'/'和'.')的左邊,表於刪除指定字符及其左邊的內容;對於%和%%的情況,它位於指定的字符(例子中的'/'和'.')的右邊,表示刪除指定字符及其右邊的內容。這里的'*'的位置不能互換,即不能把*號放在#或##的右邊,反之亦然。