BASH 字符串拆分

在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

do
       mv ${filename} ${filename%$1}$2
done

exit 0

########################################################

[liuhaifeng01@tc tmp]$ bash re_name.sh gifjpg               ## 执行脚本
[liuhaifeng01@tc tmp]$ls                                    ## 查看已经改过来了
1.jpg  2.jpg 3.jpg  4.jpg   re_name.sh 

[liuhaifeng01@tc tmp]$ bash re_name.shgif                   ##如果就填写一个参数 会推出报错
Usage: re_name.sh old_file_suffix new_file_suffix


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值