简介

原标题叫做《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脚本编程之字符串处理的更多相关文章

  1. 6-3 bash脚本编程之五 字符串测试及for循环

    1. 字符测试 ==:等号两边要有空格,否则会被认为是赋值. !=:  测试是否相等,记住如果不等为真,等为假. -n string: 测试指定字符串是否为空,空位真,不空为假. -s string: ...

  2. 高级Bash脚本编程指南(27):文本处理命令(三)

    高级Bash脚本编程指南(27):文本处理命令(三) 成于坚持,败于止步 处理文本和文本文件的命令 tr 字符转换过滤器. 必须使用引用或中括号, 这样做才是合理的. 引用可以阻止shell重新解释出 ...

  3. 高级bash脚本编程(三)

    高级bash脚本编程 知识点 compound 和 comparison -a 逻辑与 exp1 -a exp2 如果表达式 exp1 和 exp2 都为真的话,那么结果为真. -o 逻辑或 exp1 ...

  4. 高级Bash脚本编程(二)

    高级Bash脚本编程(二) 退出 退出状态码 退出:exit 被用来结束一个脚本,它也返回一个值,并且这个值会传递给脚本的父进程,父进程会使用这个值做下一步的处理. 每个命令都会返回一个退出状态码,成 ...

  5. Bash脚本编程总结

    bash脚本编程之用户交互: read [option]… [name …]  -p ‘PROMPT’  -t TIMEOUT bash -n /path/to/some_script  检测脚本中的 ...

  6. bash脚本编程知识储备

    bash脚本编程:     脚本程序:解释器解释执行: 首先得理清一些琐碎的知识点,我尽量把我所学的帮朋友一起梳理一下 编程环境:(我会在接下来的篇章,图文例子三结合的方式带大家一起学习)       ...

  7. Bash脚本编程之算术运算

    简介 Bash所支持的算术运算和C语言是一样的,这里指的是操作符(operator)以及它们的优先级(precedence).结合性(associativity)和值,详见Shell Arithmet ...

  8. Bash脚本编程之数组

    数组简介 在bash脚本编程当中,变量是存储单个元素的内存空间:而数组是存储多个元素的一段连续的内存空间. 数组由数组名和下标构成,如下. ARRAY_NAME[SUBSCRIPT] 数组按照下标的类 ...

  9. Bash脚本编程学习笔记06:条件结构体

    简介 在bash脚本编程中,条件结构体使用if语句和case语句两种句式. if语句 单分支if语句 if TEST; then CMD fi TEST:条件判断,多数情况下可使用test命令来实现, ...

随机推荐

  1. C#取视频某一帧图片

    首先下载 ffmpeg http://ffmpeg.org/ 注意一定要从官网下载,其他地方可以会有问题 解压后在 bin 目录下找到 ffmpeg.exe 用到的使命是 -i 视频地址 -ss 第几 ...

  2. Jenkins修改默认主目录及数据迁移

    前言 在使用Jenkins做持续集成的初期,未能预估项目量的大小.于是乎,配置都是使用的默认配置,而Jenkins的默认主目录放在了服务器的根目录下. 随着时间的推移,项目量的持续增加,在运维过程中就 ...

  3. 【Android - 进阶】之Dialog分类及使用

    1.确定取消对话框 代码: // 使用AlertDialog.Builder初始化对话框 AlertDialog.Builder builder0 = new AlertDialog.Builder( ...

  4. vue如何引入图片地址

    我们在用vue时储存图片时,一般把图片放在两种文件下,一个是static文件夹下,另外一个是assets文件夹下. 下面总体说一下这两个的区别及正确的引用方式: static是放不会变动的图片(或文件 ...

  5. 这货到底还是不是垃圾?【垃圾回收GC算法JVM篇四】

    目录 1.判断对象是否存活的JVM两种计数算法 2.垃圾收集算法 3.垃圾回收算法小结 垃圾收集 Garbage Collection 通常被称为"GC", 在jvm 中,程序计数 ...

  6. KETTLE多表关联的同步一张表的两种实现方式

    以下操作都在5.0.1版本下进行开发,其余版本可以进行自动比对 在平时工作当中,会遇到这种情况,而且很常见.比如:读取对方的多个视图或者表,写入目标库的一张表中,就涉及到多表的同步. 多表同步可以有以 ...

  7. luogu P1358 扑克牌

    题目描述 组合数学是数学的重要组成部分,是一门研究离散对象的科学,它主要研究满足一定条件的组态(也称组合模型)的存在.计数以及构造等方面的问题.组合数学的主要内容有组合计数.组合设计.组合矩阵.组合优 ...

  8. SpringBoot系列之Spring Data Jpa集成教程

    SpringBoot系列之Spring Data Jpa集成教程 Spring Data Jpa是属于Spring Data的一个子项目,Spring data项目是一款集成了很多数据操作的项目,其下 ...

  9. Bayer图像处理 raw 数据解析

    Bayer是相机内部的原始图片, 一般后缀名为.raw. 很多软件都可以查看, 比如PS. 我们相机拍照下来存储在存储卡上的.jpeg或其它格式的图片, 都是从.raw格式转化 过来的. .raw格式 ...

  10. 《JavaScript 模式》知识点小抄本(上)

    介绍 最近开始给自己每周订个学习任务,学习结果反馈为一篇文章的输出,做好学习记录. 这一周(02.25-03.03)我定的目标是<JavaScript 模式>的第七章学习一遍,学习结果的反 ...