Bash脚本编程学习笔记10:参数展开

简介

原标题叫做《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”方可退出脚本。

答:这道题不懂怎么做。需要注意几个点。

  • 命令(二进制程序)的执行需要库文件的支持,因此需要使用ldd命令列出命令所依赖的库文件信息。
  • ldd命令所显示出来的库文件信息,看不太懂。
  • 可能需要使用到切换根的命令?chroot?
(0)

相关推荐

  • Bash脚本编程学习笔记01:变量与多命令执行

    变量基础知识 程序由指令加数据所组成,而变量可以理解为数据来源的一种. 变量名可以理解为指向了某个内存空间的地址,对于变量的赋值可理解为向内存空间写入数据,对于变量的引用可理解为从内存空间读取数据. ...

  • Bash脚本编程学习笔记05:用户交互与脚本调试

    用户交互 在<学习笔记04>中我们有提到位置参数,位置参数是用来向脚本传递参数的一种方式.还有一种方式,是read命令. [root@c7-server ~]# read namealon ...

  • Bash脚本编程学习笔记03:算术运算

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

  • 缠论学习笔记10:三类买卖点归根结底都是第一类买卖点

    前面三篇笔记分别讲了缠论的第一.二.三类买卖点.现在简单复习一下.第一类买卖点,就是趋势背驰的买卖点.而要形成趋势背驰,前面至少要有两个同向的中枢.第二类买卖点,就是第一类买卖点之后回调或者反弹的那个 ...

  • 胡希恕伤寒论学习笔记——10

    10.风家,表解而不了了者,十二日愈. 凡是称为"家"的,都是指在某一领域长期耕耘,并且有所收获的人,像是作家--长期写作,并且著作等身:画家--长期绘画,并且有些心得. 这里的& ...

  • 王烁老师30天认知训练营学习笔记10

    今天这份笔记针对的是下面两节课程: 14 公平:实力说话 15 事实:共识先于事实 这两节课程既烧脑又非常刺激,事关我们许多核心关切,我已经听过了两遍,准备待会再认真听一遍.不过,在再听之前,先写下留 ...

  • HALCON 20.11:深度学习笔记(10)

    HALCON 20.11.0.0中,实现了深度学习方法. 本章解释了如何在训练和推理阶段使用基于深度学习的分类. 基于深度学习的分类是一种对一幅图像分配一组置信值的方法.这些置信度值表明图像属于每个可 ...

  • (1条消息) Excel中VBA编程学习笔记(十五)

    [例1]使用Connection对象的Execute方法删除数据 数据库格式: Sub test() Dim conString$, sqlString$ Dim cnn, rst Set cnn = ...

  • (1条消息) Excel中VBA编程学习笔记(十四)

    数据库表如下: [例1]使用Recordset插入数据 Excel表格内容如下: Sub test() 'Dim cnn As New ADODB.Connection 'Dim rst As New ...