Bash脚本编程之字符串处理
2019-12-05 07:48:23来源:博客园 阅读 ()
Bash脚本编程之字符串处理
简介
其实这里说得字符串处理,对应的是bash官网中的【Shell Parameter Expansion】,不过直接去看这部分内容实在是太难以理解了。就按照马哥所说的字符串处理会比较好理解,平常使用应该也是足够的了。
字符串切片
这块在上一篇讲解数组的文章中,也大概提到了Shell Parameter Expansion除了可以对数组(array)切片以外,还可以对变量切片。
${var:offset:number}
${var: length}
[root@c7-server ~]# name="zhangwenlong" [root@c7-server ~]# echo ${name} zhangwenlong [root@c7-server ~]# echo ${name:2:5} angwe [root@c7-server ~]# echo ${name: -4} long
基于pattern取子串
这里的pattern,应该是glob或者类glob的,而非正则表达式,详见官方的Pattern Matching。
${var#*pattern}:在变量var的值中自左向右查询pattern,若查询到,则删除值首部至第一次出现的pattern之间的所有字符。
[root@c7-server ~]# echo ${name} zhangwenlong [root@c7-server ~]# echo ${name#*wen} long [root@c7-server ~]# echo ${name} zhangwenlong
${var##*pattern}:在变量var的值中自左向右查询pattern,若查询到,则删除值首部至最后一次出现的pattern之间的所有字符。
[root@c7-server ~]# echo ${name} zhangwenlong [root@c7-server ~]# echo ${name#*n} gwenlong [root@c7-server ~]# echo ${name##*n} g
${var%pattern*}:在变量var的值中自右向左查询pattern,若查询到,则删除值尾部至第一次出现的pattern之间的所有字符。
${var%%pattern*}:在变量var的值中自右向左查询pattern,若查询到,则删除值尾部至最后一次出现的pattern之间的所有字符。
[root@c7-server ~]# echo ${name} zhangwenlong [root@c7-server ~]# echo ${name%n*} zhangwenlo [root@c7-server ~]# echo ${name%%n*} zha
查找替换
${var/PAT/SUB}:在变量var的值中从左往右查找,只有第一次出现的PAT(pattern)会被替换成SUB(substitute)。
[root@c7-server ~]# echo ${userinfo} root:x:0:0:root:/root:/bin/bash [root@c7-server ~]# echo ${userinfo/r??t/centos} centos:x:0:0:root:/root:/bin/bash
${var//PAT/SUB}:在变量var的值中从左往右查找,所有出现的PAT都会被替换成SUB。
[root@c7-server ~]# echo ${userinfo} root:x:0:0:root:/root:/bin/bash [root@c7-server ~]# echo ${userinfo//r??t/centos} centos:x:0:0:centos:/centos:/bin/bash
${var/#PAT/SUB}:在变量var的值中从左往右查找,只有行首出现的PAT都会被替换成SUB。
[root@c7-server ~]# echo ${userinfo} root:x:0:0:root:/root:/bin/bash [root@c7-server ~]# echo ${userinfo/#r??t/centos} centos:x:0:0:root:/root:/bin/bash
${var/%PAT/SUB}:在变量var的值中从左往右查找,只有行尾出现的PAT都会被替换成SUB。
[root@c7-server ~]# echo ${userinfo} root:x:0:0:root:/root:/bin/bash [root@c7-server ~]# echo ${userinfo/%bash/zsh} root:x:0:0:root:/root:/bin/zsh
查找删除
${var/PAT}:在变量var的值中从左往右查找,只有第一次出现的PAT会被删除。
[root@c7-server ~]# echo ${userinfo} root:x:0:0:root:/root:/bin/bash [root@c7-server ~]# echo ${userinfo/root} :x:0:0:root:/root:/bin/bash
${var//PAT}:在变量var的值中从左往右查找,所有出现的PAT会被删除。
[root@c7-server ~]# echo ${userinfo} root:x:0:0:root:/root:/bin/bash [root@c7-server ~]# echo ${userinfo//root} :x:0:0::/:/bin/bash
${var/#PAT}:在变量var的值中从左往右查找,只有行首出现的PAT会被删除。
[root@c7-server ~]# echo ${userinfo} root:x:0:0:root:/root:/bin/bash [root@c7-server ~]# echo ${userinfo/#root} :x:0:0:root:/root:/bin/bash
${var/%PAT}:在变量var的值中从左往右查找,只有行尾出现的PAT会被删除。
[root@c7-server ~]# echo ${userinfo} root:x:0:0:root:/root:/bin/bash [root@c7-server ~]# echo ${userinfo/%bash} root:x:0:0:root:/root:/bin/
字符大小写转换
${var^^}:将变量var中的所有小写字符转换成大写。
${var,,}:将变量var中的所有大写字符转换成小写。
[root@c7-server ~]# name=RenDanChaoXian [root@c7-server ~]# echo ${name^^} RENDANCHAOXIAN [root@c7-server ~]# echo ${name,,} rendanchaoxian
变量赋值
${var:-VALUE}:如果变量var为空或者未设置,则返回VALUE;否则返回变量var的值。注意,变量name本身的值不会被修改。
[root@c7-server ~]# echo ${name} RenDanChaoXian [root@c7-server ~]# echo ${name:-alongdidi} RenDanChaoXian [root@c7-server ~]# unset name [root@c7-server ~]# echo ${name:-alongdidi} alongdidi [root@c7-server ~]# echo ${name} [root@c7-server ~]# name= [root@c7-server ~]# echo ${name:-alongdidi} alongdidi [root@c7-server ~]# echo ${name} [root@c7-server ~]#
${var:=VALUE}:如果变量var为空或者未设置,则返回VALUE,并将VALUE赋值给变量var;否则返回变量var的值。
[root@c7-server ~]# name=zwl [root@c7-server ~]# echo ${name} zwl [root@c7-server ~]# echo ${name:=alongdidi} zwl [root@c7-server ~]# unset name [root@c7-server ~]# echo ${name:=alongdidi} alongdidi [root@c7-server ~]# echo ${name} alongdidi [root@c7-server ~]# name= [root@c7-server ~]# echo ${name:=alongdidi} alongdidi [root@c7-server ~]# echo ${name} alongdidi
${var:+VALUE}:如果变量为空或者未设置,那么不会返回任何值。否则则返回VALUE的值。注意,变量name本身的值不会被修改。
[root@c7-server ~]# name= [root@c7-server ~]# echo ${name:+alongdidi} [root@c7-server ~]# unset name [root@c7-server ~]# echo ${name:+alongdidi} [root@c7-server ~]# name=zwl [root@c7-server ~]# echo ${name:+alongdidi} alongdidi [root@c7-server ~]# echo ${name} zwl [root@c7-server ~]#
${var:?ERROR_INFO}:如果变量var为空或者未设置,则返回错误信息ERROR_INFO;否则返回变量var的值。
[root@c7-server ~]# name= [root@c7-server ~]# echo ${name:?"There is something wrong"} -bash: name: There is something wrong [root@c7-server ~]# unset name [root@c7-server ~]# echo ${name:?"There is something wrong"} -bash: name: There is something wrong [root@c7-server ~]# name=zwl [root@c7-server ~]# echo ${name:?"There is something wrong"} zwl
练习
写一个脚本,实现如下功能:
提示用户输入一个可执行的命令的名称,如ls。
获取该命令所依赖的库文件列表(借助ldd命令)。
复制命令至某目标目录(例如:/mnt/sysroot/,即将此目录当做新的根目录)下的对应路径中。
bash, /bin/bash --> /mnt/sysroot/bin/bash
useradd, /usr/sbin/useradd --> /mnt/sysroot/usr/sbin/useradd
复制命令所依赖的库文件至对应的目标目录下。
/lib64/ld-linux-x8664.so.2 --> /mnt/sysroot/lib64/ld-linux-x8664.so.2
进阶:每次复制完一个命令后不退出,而是等待用户键入新的需要复制的命令,直到用户显示输入“quit”方可退出脚本。
原文链接:https://www.cnblogs.com/alongdidi/p/bash_parameter_expansion.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:QT获取linux下的当年用户名
- Linux系统如何设置开机自动运行脚本? 2020-06-11
- Linux指令和shell脚本 2020-06-11
- Ubuntu下用脚本执行sql语句(sqlite) 2020-05-29
- 如何将目录下的脚本一次性全部执行 2020-05-28
- Bash Shell基础笔记 2020-05-26
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash