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
${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的'/'或'.'。也就是说,上面的使用方法只是它使用的一个特例。
看到上面的这些命令,可能会让人感到非常难以理解和记忆,其实不然,它们都是有规律的。
#:表示从左边算起第一个
%:表示从右边算起第一个
##:表示从左边算起最后一个
%%:表示从右边算起最后一个
换句话来说,#总是表示左边算起,%总是表示右边算起。
*:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;对于%和%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。