高级bash脚本编程

知识点

compound 和 comparison

  • -a 逻辑与 exp1 -a exp2 如果表达式 exp1 和 exp2 都为真的话,那么结果为真。

  • -o 逻辑或 exp1 -o exp2 如果表达式 exp1 和 exp2 中至少有一个为真的话,那么结果为真。

  • 注意:这与Bash中的比较操作符 && 和 || 非常相像,但是这个两个操作符是用在双中括号结构中的。

  • [[ condition1 && condition2 ]]

  • -o和-a操作符一般都是和test命令或者是单中括号结构一起使用的

  • if [ "\(exp1" -a "\)exp2" ]

操作符

  1. 赋值

    • var=27 注意:在"="之后是不允许出现空白字符,不要混淆= 赋值操作符与 = (有空格)测试操作符
  2. 算术操作符

    • 加法计算
    • 减法计算
    • 乘法计算
  • / 除法计算
  • ** 幂运算
  • % 模运算,或者是求余运算(返回一次除法运算的余数)
  1. 位操作符
  • << 左移一位(每次左移都相当于乘以2)

  • <<= “左移-赋值”

  • let "var <<= 2" #这句的结果就是变量var左移2位(就是乘以4)

  • >> 右移一位(每次右移都将除以2)

  • >>= “右移-赋值”(与<<=正好相反)

  • & 按位与

  • &= “按位与-赋值”

  • | 按位或

  • |= “按位或-赋值”

  • ~ 按位反

  • ! 按位非

  • ^ 按位异或XOR

  • ^= “按位异或-赋值”

  1. 逻辑操作符
  • 使用&&和||进行混合条件测试
  • 双中括号的if-test结构要比单中括号的if-test结构更加灵活.
  1. 其他混杂的操作符
  • , 逗号操作符可以连接两个或多个算术运算。所有的操作都会被运行(可能会有负作用),但是只会返回最后操作的结果。

变量

  1. 内置变量
  • $BASH Bash的二进制程序文件的路径(脚本解释器的路径)
  • $FUNCNAME 当前函数的名字
  • $IFS 内部域分隔符,这个变量用来决定 Bash 在解释字符串时如何识别域,或者单词边界。
  • \(REPLY 当没有参数变量提供给 read 命令的时候,这个变量会作为默认变量提供给 read 命令。也 可以用于 select 菜单,但是只提供所选择变量的编号,而不是变量本身的值。在个别版本的bash中,并不支持内置变量\)REPLY。
  • 通过\(*和\)@列出所有的参数,"$" 所有的位置参数都被看作为一个单词。 $@与 $ 相同,但是每个参数都是一个独立的引用字符串,这就意味着,参数是被完整 传递的,并没有被解释或扩展。这也意味着,参数列表中每个参数都被看作为单独的单词。

操作字符串

  1. 字符串长度

    • echo ${#stringZ}
    • expr length $stringZ
  2. 使用awk来处理字符串

    • 提取字符串
   echo | awk '
{
print substr("'"${String}"'",3,4) # skid
}
'
  • 等价于echo ${String:2:4} # 位置 3 (0-1-2), 4 个字符长

参数替换

  1. 处理和拓展变量
  • ${parameter-default} 如果变量 parameter 没被声明,那么就使用默认值。
  • ${parameter:-default} 如果变量 parameter 没被设置,那么就使用默认值。
  • ${parameter=default} 如果变量parameter没声明,那么就把它的值设为default。
  • ${parameter:=default} 如果变量parameter没设置,那么就把它的值设为default。
  • ${parameter+alt_value} 如果变量parameter被声明了,那么就使用alt_value,否则就使用null字符串。
  • ${parameter:+alt_value} 如果变量parameter被设置了,那么就使用alt_value,否则就使用null字符串。
  • ${parameter?err_msg} 如果parameter已经被声明,那么就使用设置的值,否则打印err_msg错误消息。
  • ${parameter:?err_msg} 如果parameter已经被设置,那么就使用设置的值,否则打印err_msg错误消息。
  1. 变量长度/子串删除
  • \({#var} 字符串长度(变量\)var得字符个数)。对于array来说,${#array}表示的是数组中第一个元素的长度.
  • ${var#Pattern}, \({var##Pattern} 从变量\)var的开头删除最短或最长匹配$Pattern的子串。 “#”表示匹配最短,“##”表示匹配最长
  • ${var%Pattern}, \({var%%Pattern} 从变量\)var的结尾删除最短或最长匹配$Pattern的子串。 “%”表示匹配最短,“%%”表示匹配最长。
  1. 变量拓展/子串替代
  • ${var:pos} 变量var从位置pos开始扩展, 也就是pos之前的字符都丢弃。
  • ${var:pos:len} 变量var从位置pos开始,并扩展len个字符。
  • ${var/Pattern/Replacement} 使用Replacement来替换变量var中第一个匹配Pattern的字符串。
  • ${var//Pattern/Replacement} 全局替换。所有在变量var匹配Pattern的字符串,都会被替换为Replacement。
  • ${var/#Pattern/Replacement} 如果变量var的前缀匹配Pattern,那么就使用Replacement来替换匹配到Pattern的字符串。
  • ${var/%Pattern/Replacement} 如果变量var的后缀匹配Pattern,那么就使用Replacement来替换匹配到Pattern的字符串
  • t=${var1#*-} 也一样,
  • 因为#匹配最短的字符串,
  • 同时*匹配任意前缀, 包括空字符串.

指定变量的类型

  1. declare/typeset选项

    -r 只读

    -i 整型

    -a 数组

    -f 函数

    -x export

变量的间接引用

  1. 间接引用

    - 假设一个变量的值是第二个变量的名字。如果a=letter_of_alphabet并且letter_of_alphabet=z, 它被称为间接引用。我们能够通过引用变量a来获得z,它使用eval var1=$\(var2这种不平常的形式。
    - eval a=\$\)a

  2. 传递一个间接引用给awk

    多行的awk脚本的调用方法为: awk ' ..... '

 awk脚本开始.
------------------------------------------------
awk " { total += \$${column_number} # 间接引用
}
END { print total
} " "$filename" ------------------------------------------------
awk脚本结束.

双圆括号结构

与let命令很相似,((...)) 结构允许算术扩展和赋值。 如,a=$(( 5 + 3 )),将把变量“a”设为“5 + 3”,或者8;(( a = 23 )) .

实验截图

3-1:



3-2:



3-2调试



3-3:



3-4:



3-5



3-6



高级bash脚本编程(三)的更多相关文章

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

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

  2. 高级Bash脚本编程指南《Advanced Bash-Scripting Guide》 in Chinese

    <Advanced Bash-Scripting Guide> in Chinese <高级Bash脚本编程指南>Revision 10中文版 在线阅读链接:http://ww ...

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

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

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

    高级Bash脚本编程 Bash 它是能力很强的计算机语言,被称为解释性语言或脚本语言,它可以调用所有的UNIX命令和工具再加上公共程序. Bash中的特殊字符 注释(#) (除#!外,#!是用于指定当 ...

  5. advanced base-scripting guide in chinese(高级Bash脚本编程指南-10)

    <高级Bash脚本编程指南>Revision 10中文版 github上链接地址: https://github.com/LinuxStory/Advanced-Bash-Scriptin ...

  6. 《Advanced Bash-Scripting Guide》 in Chinese 高级Bash脚本编程指南》Revision 10中文版

    <Advanced Bash-Scripting Guide> in Chinese <高级Bash脚本编程指南>Revision 10中文版 在线阅读链接:http://ww ...

  7. 脚本命令高级Bash脚本编程指南(31):数学计算命令

    题记:写这篇博客要主是加深自己对脚本命令的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 高等Bash脚本编程指南(31):数学盘算命令 成于坚持,败于止步 操作数字 factor ...

  8. 实验楼-高级Bash脚本编程指南

    实验1.Bash介绍与入门 1.简介:Bash是一个为GNU计划编写的Unix shell,它是许多Linux平台默认使用的shell shell是一个命令解释器,是介于操作系统内核与用户之间的一个绝 ...

  9. 实验楼高级bash脚本编程指南 挑战:简单的热身

    传送门:https://www.shiyanlou.com/courses/running# 步骤一 新建一个 test.sh 输出 Hello Shiyanlou! 步骤二 复制 test.sh 为 ...

随机推荐

  1. MyBatis官方文档——入门

    入门 安装 要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可. 如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 ...

  2. struts2漏洞原理

    一.struts2简介: 目前web框架中非常流行的都是mvc设计模式.经典例子例如:python的Django.Flask:java的ssm等.因为使用MVC设计模式,所以在框架内部处理用户数据流参 ...

  3. C#文件下载的几种方式

    第一种:最简单的超链接方法,<a>标签的href直接指向目标文件地址,这样容易暴露地址造成盗链,这里就不说了 1.<a>标签 <a href="~/Home/d ...

  4. Android在ArrayAdapter<>里如何得到List<>的Items

    public class ItemAdapter extends ArrayAdapter<DemoModel> { private final List<DemoModel> ...

  5. HDCMS导航高亮显示!解决办法

    第一种方法:(传递class) <channel type='top' row='8' class='cur' > <li class='{$field.class}'> &l ...

  6. pycharm 和 Anaconda 下的 opencv 安装

    学习真的切忌三天打鱼两天晒网!! 一开始python下的opencv已经都弄好了,中间电脑坏了一次,好久没有接触这个,就全部都忘完了.深感惋惜. 今天又从新安装了一下opencv.在anaconda下 ...

  7. 次小生成树(poj1679)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20737   Accepted: 7281 D ...

  8. U盘安装Win7系统,遇到硬盘鼠标键盘失灵等情况,如何安装U盘中加入USB3.0驱动的支持

    U盘安装系统出现鼠标键盘不能使用,在intel六代处理器平台,安装过程中会出现安装原生镜像不能识别或者鼠标键盘不能使用等情况,可以参考以下方法进行. 风险提示:重装或升级系统会导致系统盘数据丢失,建议 ...

  9. 报警告session_regenerate_id(): Failed to create(read) session ID: files (path: N;/path)

    php.ini文件中的session.save_path = "N;/path"注释掉(前面加分号)

  10. python threading.thread

    Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading.Thread对 ...