Bash脚本编程之字符串处理
简介
原标题叫做《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::}
angwe
[root@c7-server ~]# echo ${name: -}
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:::root:/root:/bin/bash
[root@c7-server ~]# echo ${userinfo/r??t/centos}
centos:x:::root:/root:/bin/bash
${var//PAT/SUB}:在变量var的值中从左往右查找,所有出现的PAT都会被替换成SUB。
[root@c7-server ~]# echo ${userinfo}
root:x:::root:/root:/bin/bash
[root@c7-server ~]# echo ${userinfo//r??t/centos}
centos:x:::centos:/centos:/bin/bash
${var/#PAT/SUB}:在变量var的值中从左往右查找,只有行首出现的PAT都会被替换成SUB。
[root@c7-server ~]# echo ${userinfo}
root:x:::root:/root:/bin/bash
[root@c7-server ~]# echo ${userinfo/#r??t/centos}
centos:x:::root:/root:/bin/bash
${var/%PAT/SUB}:在变量var的值中从左往右查找,只有行尾出现的PAT都会被替换成SUB。
[root@c7-server ~]# echo ${userinfo}
root:x:::root:/root:/bin/bash
[root@c7-server ~]# echo ${userinfo/%bash/zsh}
root:x:::root:/root:/bin/zsh
查找删除
${var/PAT}:在变量var的值中从左往右查找,只有第一次出现的PAT会被删除。
[root@c7-server ~]# echo ${userinfo}
root:x:::root:/root:/bin/bash
[root@c7-server ~]# echo ${userinfo/root}
:x:::root:/root:/bin/bash
${var//PAT}:在变量var的值中从左往右查找,所有出现的PAT会被删除。
[root@c7-server ~]# echo ${userinfo}
root:x:::root:/root:/bin/bash
[root@c7-server ~]# echo ${userinfo//root}
:x::::/:/bin/bash
${var/#PAT}:在变量var的值中从左往右查找,只有行首出现的PAT会被删除。
[root@c7-server ~]# echo ${userinfo}
root:x:::root:/root:/bin/bash
[root@c7-server ~]# echo ${userinfo/#root}
:x:::root:/root:/bin/bash
${var/%PAT}:在变量var的值中从左往右查找,只有行尾出现的PAT会被删除。
[root@c7-server ~]# echo ${userinfo}
root:x:::root:/root:/bin/bash
[root@c7-server ~]# echo ${userinfo/%bash}
root:x:::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”方可退出脚本。
答:这道题不懂怎么做。需要注意几个点。
- 命令(二进制程序)的执行需要库文件的支持,因此需要使用ldd命令列出命令所依赖的库文件信息。
- ldd命令所显示出来的库文件信息,看不太懂。
- 可能需要使用到切换根的命令?chroot?
Bash脚本编程之字符串处理的更多相关文章
- 6-3 bash脚本编程之五 字符串测试及for循环
1. 字符测试 ==:等号两边要有空格,否则会被认为是赋值. !=: 测试是否相等,记住如果不等为真,等为假. -n string: 测试指定字符串是否为空,空位真,不空为假. -s string: ...
- 高级Bash脚本编程指南(27):文本处理命令(三)
高级Bash脚本编程指南(27):文本处理命令(三) 成于坚持,败于止步 处理文本和文本文件的命令 tr 字符转换过滤器. 必须使用引用或中括号, 这样做才是合理的. 引用可以阻止shell重新解释出 ...
- 高级bash脚本编程(三)
高级bash脚本编程 知识点 compound 和 comparison -a 逻辑与 exp1 -a exp2 如果表达式 exp1 和 exp2 都为真的话,那么结果为真. -o 逻辑或 exp1 ...
- 高级Bash脚本编程(二)
高级Bash脚本编程(二) 退出 退出状态码 退出:exit 被用来结束一个脚本,它也返回一个值,并且这个值会传递给脚本的父进程,父进程会使用这个值做下一步的处理. 每个命令都会返回一个退出状态码,成 ...
- Bash脚本编程总结
bash脚本编程之用户交互: read [option]… [name …] -p ‘PROMPT’ -t TIMEOUT bash -n /path/to/some_script 检测脚本中的 ...
- bash脚本编程知识储备
bash脚本编程: 脚本程序:解释器解释执行: 首先得理清一些琐碎的知识点,我尽量把我所学的帮朋友一起梳理一下 编程环境:(我会在接下来的篇章,图文例子三结合的方式带大家一起学习) ...
- Bash脚本编程之算术运算
简介 Bash所支持的算术运算和C语言是一样的,这里指的是操作符(operator)以及它们的优先级(precedence).结合性(associativity)和值,详见Shell Arithmet ...
- Bash脚本编程之数组
数组简介 在bash脚本编程当中,变量是存储单个元素的内存空间:而数组是存储多个元素的一段连续的内存空间. 数组由数组名和下标构成,如下. ARRAY_NAME[SUBSCRIPT] 数组按照下标的类 ...
- Bash脚本编程学习笔记06:条件结构体
简介 在bash脚本编程中,条件结构体使用if语句和case语句两种句式. if语句 单分支if语句 if TEST; then CMD fi TEST:条件判断,多数情况下可使用test命令来实现, ...
随机推荐
- [ASP.NET Core 3框架揭秘] 配置[1]:读取配置数据[上篇]
提到"配置"二字,我想绝大部分.NET开发人员脑海中会立即浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化 ...
- node.js多进程架构
node.js是单进程应用,要充分利用多核cpu的性能,就需要用到多进程架构. 作为web服务器,不能多个进程创建不同的socket文件描述符去accept网络请求, 有经验的同学知道,如果端口被占用 ...
- synchronized被这么问,谁能受得了
synchronized是面试中经常会被问到的知识点,相关的问题点也很多,问题答案涉及的知识点也很多,有经验的面试官就会顺着你的答案不断追问一下,下面的对话场景就是相关面试题的连环炮. 面试官:说一下 ...
- VUE的中v-if和v-shou的区别
v-if的特点:每次都会重新删除或创建元素 v-shou的特点:每次执行都只是切换了元素的display:none的属性 v-if的缺点: 每次使用都会有较高性能消耗(频繁的切换元素建议不适用,建议使 ...
- FastAdmin的基本使用
FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架. 1.在线命名管理 (1)菜单的生成 (2)一键 crud 首先要安装在线命名 在翡翠分类生成菜单,如下: 它的 ...
- 输入URL到页面渲染
输入网址回车或者刷新页面到页面传染出来的整个流程 DNS 解析 HTTP三次握手 -> TCP/IP连接 浏览器发送请求 服务器返回请求的文件 (html) 浏览器渲染 1. DNS 解析 查找 ...
- 【Java库】如何使用优秀的加密库Jasypt来保护你的敏感信息?
1 简介 今天我们介绍一个Java库-Jasypt,全称为Java Simplified Encryption,用于加密解密.它能够让开发者用花费最小的工作而把加密集成到项目中,并且不需要对加密/解密 ...
- vue axios 总结篇
1.npm --save 和 --save-dev 有什么区别 发布到线上的叫生产环境~,在本地开发的时候叫开发环境,--save就是会打包到线上去并且在线上环境能用到的,比如你npm install ...
- 使用@media实现移动端使用@2x,@3x切换
/*dpr比值为1的css代码 */ div{ width:300px; height:200px; background:url(img/button@1x.png) ; } /* dpr比值为 ...
- 线性规划VB求解
线性规划VB求解 Rem 定义动态数组 Dim a() As Single, c() As Single, b() As Single, cb() As Single Dim aa() As Sing ...