在bash编程中对字符串的拆分应用很普遍,下面介绍字符串拆分的方法:
一、目录名和文件名的拆分
获取目录名命令:
dirname 参数(文件名却绝对路径)
文件名:
basename 参数(文件名绝对路径)
例一:
basename /usr/local/share/doc/foo/foo.txt
foo.txt
dirname /usr/local/share/doc/foo/foo.txt
/usr/local/share/doc/foo
例二:
dirname /usr/local/share/doc/foo/
/usr/local/share/doc
basename /usr/local/share/doc/foo/
foo # 最后的"/"被截去了
basename、dirname是最简单的字符串截取命令。
二、字符串任意截取算符
任意截取字符串需要用两个算符:"#"和"%","#"是截取前面字符串、"%"是截取后面的字符串,它们通常与前面的字符串连用
例一:截取前面的字符串
$ myfoo="afoaafoaaafoaaaa.tar.gz"
$ echo ${myfoo#*fo}
$aafoaaafoaaaa.tar.gz # 将匹配"*fo"的最短字符串左边全部截去
$ echo ${myfoo##*fo}
$aaaa.tar.gz # 将匹配"*fo"的最长字符串左边全部截去
匹配过程:
a
af
afo # fo 第一次匹配
afoa
afoaa
afoaaf
afoaafo # fo 第二次匹配
afoaafoa
afoaafoaa
afoaafoaaa
afoaafoaaaf
afoaafoaaafo # fo 第三次匹配
afoaafoaaafoa
afoaafoaaafoaa
afoaafoaaafoaaa
afoaafoaaafoaaaa
...
例二、截取左边的字符串
$ myfoo="afoaafoaaafoaaaa.tar.gz"
$ echo ${myfoo%fo*}
$afoaafoaaa # 将匹配 "fo*" 的最短字符串右边全部截去
$ echo ${myfoo%%fo*}
$ a # 将匹配 "fo*" 的最长字符串右边全部截去
可见"*fo"是向左边匹配,与"#"结合使用,而"fo*"是向右边匹配,与"%"结合使用。
三、字符串:起点:偏移截取字符串
指定字符串:起点:偏移截取字符串更方便
例一:
$ myfoo=afoaafoaaafoaaaa.tar.gz
$ echo${myfoo:4:5} # 截取 ${myfoo} 中的第4个字符起,向右数5个字符
$ afoaa
字符的编号实际是字符串在内存中的存放位置,从 0 开始
a f o a a f o a a a f o a a a a . t a r . g z
0 1 2 3 4 5 6 7 8 9 ...
四、使用脚本举例:修改批量文件的后缀名
#####################################################
#!/bin/bash
# 用法 re_name.sh old_suffix new_suffix
# 目录信息,以及参数错误返回值
# 判断参数个数是否小于2,是则退出脚本返回错误值
ER_PAR=66
case $# in
0|1)
echo "Usage: `basename $0` old_file_suffix new_file_suffix"
exit $ER_PAR
;;
esac
# 改名
filelist=`ls *.$1`
for filename in filelist
一、目录名和文件名的拆分
获取目录名命令:
dirname 参数(文件名却绝对路径)
文件名:
basename
例一:
basename /usr/local/share/doc/foo/foo.txt
foo.txt
dirname /usr/local/share/doc/foo/foo.txt
/usr/local/share/doc/foo
例二:
dirname /usr/local/share/doc/foo/
/usr/local/share/doc
basename /usr/local/share/doc/foo/
foo
basename、dirname是最简单的字符串截取命令。
二、字符串任意截取算符
任意截取字符串需要用两个算符:"#"和"%","#"是截取前面字符串、"%"是截取后面的字符串,它们通常与前面的字符串连用
例一:截取前面的字符串
$ myfoo="afoaafoaaafoaaaa.tar.gz"
$ echo ${myfoo#*fo}
$aafoaaafoaaaa.tar.gz
$ echo ${myfoo##*fo}
$aaaa.tar.gz
匹配过程:
a
af
afo
afoa
afoaa
afoaaf
afoaafo
afoaafoa
afoaafoaa
afoaafoaaa
afoaafoaaaf
afoaafoaaafo
afoaafoaaafoa
afoaafoaaafoaa
afoaafoaaafoaaa
afoaafoaaafoaaaa
...
例二、截取左边的字符串
$ myfoo="afoaafoaaafoaaaa.tar.gz"
$ echo ${myfoo%fo*}
$afoaafoaaa
$ echo ${myfoo%%fo*}
$ a
可见"*fo"是向左边匹配,与"#"结合使用,而"fo*"是向右边匹配,与"%"结合使用。
三、字符串:起点:偏移截取字符串
指定字符串:起点:偏移截取字符串更方便
例一:
$ myfoo=afoaafoaaafoaaaa.tar.gz
$ echo${myfoo:4:5}
$ afoaa
字符的编号实际是字符串在内存中的存放位置,从 0 开始
a f o a a f o a a a f o a a a a . t a r . g z
0 1 2 3 4 5 6 7 8 9 ...
四、使用脚本举例:修改批量文件的后缀名
#####################################################
#!/bin/bash
# 用法 re_name.sh old_suffix new_suffix
# 目录信息,以及参数错误返回值
# 判断参数个数是否小于2,是则退出脚本返回错误值
ER_PAR=66
case $# in
esac
# 改名
filelist=`ls *.$1`
for filename in filelist
do
done
exit 0
########################################################
[liuhaifeng01@tc tmp]$ bash re_name.sh gifjpg
[liuhaifeng01@tc tmp]$ls
1.jpg
[liuhaifeng01@tc tmp]$ bash re_name.shgif
Usage: re_name.sh old_file_suffix new_file_suffix