高级Bash脚本编程(二)

退出

退出状态码

  1. 退出:exit 被用来结束一个脚本,它也返回一个值,并且这个值会传递给脚本的父进程,父进程会使用这个值做下一步的处理。
  2. 每个命令都会返回一个退出状态码,成功的命令返回 0,不成功的命令返回非零值,非零值通常都被解释成一个错误码。
  3. 练习截图

反转条件用法

! 逻辑“非”操作符,将会反转命令或条件测试的结果,并且这会影响退出状态码。

条件判断

if/then 结构用来判断命令列表的退出状态码是否为 0,因为0表示成功,如果成功的话,这里应该那么就执行接下来的一个或多个命令。true返回的是0,false返回的是1

  • test3.sh

多级比较

 #!/bin/bash

 if echo "Next *if* is part of the comparison for the first *if*."
if [[ $comparison = "integer" ]]
then (( a < b )) # (( 算数表达式 )), 用作算数运算
else
[[ $a < $b ]]
fi
then
echo '$a is less than $b'
fi
  • 注意: ((...))和let...如果运算结果为非0,该语句退出码为0,否则为1;[[...]]是作为一个单独的语句并且会返回一个退出码

    ,真返回0,假返回1.

真假判断

NULL和未初始化的变量、初始化为Null的变量,$false为假

(( )) 结构

  • 扩展并计算一个算术表达式的值。如果表达式的结果为0,那么返回的退出状态码为1,或者是"假"。而一个非零值的表达式所返回的退出状态码将为0,或者是"true"。
  • (( ... ))结构可以用来计算并测试算术表达式的结果,退出状态将会与[ ... ]结构完全相反。

文件测试操作符

操作符

说明

  • -e 文件存在
  • -a 文件存在,这个选项的效果与 -e 相同。但是它已经被“弃用”了,并且不鼓励使用。
  • -f 表示这个文件是一个一般文件(并不是目录或者设备文件)
  • -s 文件大小不为零
  • -d 表示这是一个目录
  • -b 表示这是一个块设备(软盘,光驱,等等)
  • -c 表示这是一个字符设备(键盘,modem,声卡,等等)
  • -p 这个文件是一个管道
  • -h 这是一个符号链接
  • -L 这是一个符号链接
  • -S 表示这是一个socket
  • -t 文件(描述符)被关联到一个终端上,这个测试选项一般被用来检测脚本中的stdin([ -t 0 ]) 或者 stdout([ -t 1 ])是否来自于一个终端
  • -r 文件是否具有可读权限(指的是正在运行这个测试命令的用户是否具有读权限)
  • -w 文件是否具有可写权限(指的是正在运行这个测试命令的用户是否具有写权限)
  • -x 文件是否具有可执行权限(指的是正在运行这个测试命令的用户是否具有可执行权限)
  • -g set-group-id(sgid)标记被设置到文件或目录上
  • -k 设置粘贴位
  • -O 判断你是否是文件的拥有者
  • -G 文件的group-id是否与你的相同
  • -N 从文件上一次被读取到现在为止, 文件是否被修改过
  • f1 -nt f2 文件f1比文件f2新
  • f1 -ot f2 文件f1比文件f2旧
  • f1 -ef f2 文件f1和文件f2是相同文件的硬链接
  • ! “非”,反转上边所有测试的结果(如果没给出条件,那么返回真)

二元比较操作符

整数比较

  • -eq 等于

    if [ "\(a" -eq "\)b" ]

  • -ne 不等于

    if [ "\(a" -ne "\)b" ]

  • -gt 大于

    if [ "\(a" -gt "\)b" ]

  • -ge 大于等于

    if [ "\(a" -ge "\)b" ]

  • -lt 小于

    if [ "\(a" -lt "\)b" ]

  • -le 小于等于

    if [ "\(a" -le "\)b" ]

  • < 小于(在双括号中使用)

    (("\(a" < "\)b"))

  • <= 小于等于(在双括号中使用)

    (("\(a" <= "\)b"))

  • 大于(在双括号中使用)

    (("\(a" > "\)b"))

  • = 大于等于(在双括号中使用)

    (("\(a" >= "\)b"))

字符串比较

  • = 等于

    if [ "\(a" = "\)b" ]

  • == 等于,与=等价

    if [ "\(a" == "\)b" ]

  • != 不等号

    if [ "\(a" != "\)b" ]

  • < 小于,按照ASCII字符进行排序

    if [[ "\(a" < "\)b" ]]

    if [ "\(a" \< "\)b" ]

    注意"<"使用在[ ]结构中的时候需要被转义

  • 大于,按照ASCII字符进行排序

    if [[ "\(a" > "\)b" ]]

    if [ "\(a" \> "\)b" ]

    注意“>”使用在[ ]结构中的时候需要被转义

  • -z 字符串为“null”,意思就是字符串长度为零 -n 字符串不为“null”

实验过程截图

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

  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. PHP中str_replace和substr_replace有什么区别?

    两个函数的定义:(1)str_replace() 函数替换字符串中的一些字符(区分大小写). 该函数必须遵循下列规则: 如果搜索的字符串是一个数组,那么它将返回一个数组. 如果搜索的字符串是一个数组, ...

  2. Android英文文档翻译系列(2)——HandlerThread

      public class   HandlerThread extends Thread   Class  Overview Handy class for starting a new threa ...

  3. Ubuntu16.04安装Elasticsearch

    一.安装工作 wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - sudo apt-g ...

  4. Android Studio 解决Fetching android sdk component information加载过久问题

    extends:http://www.cnblogs.com/sonyi/p/4154797.html 安装完成后,如果直接启动,Android Studio会去获取 android sdk 组件信息 ...

  5. JFinal的启动源码解读

    本文对Jfinal的启动源码做解释说明. PS:Jfinal启动容器可基于Tomcat/Jetty等web容器启动,本文基于Jetty的启动方式做启动源码的解读和分析,tomcat类似. 入口  JF ...

  6. Swift - 获取当前系统时间

    // 获取当前系统时间 let date = NSDate() let timeFormatter = NSDateFormatter() timeFormatter.dateFormat = &qu ...

  7. angularJS中的MVC思想?

    mvc 思想: 将应用程序的组成,划分为三个部分:model , controller 和 view ; - 控制器的作用是用来初始化模型用的: - 模型就是用于存储数据的: - 视图是展示数据的: ...

  8. Code Forces 652D Nested Segments(离散化+树状数组)

     Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  9. 使用 Visual Studio 将 ASP.NET Web 应用部署到 Azure

    原文地址:https://www.azure.cn/zh-cn/documentation/articles/web-sites-dotnet-get-started 配置新的 Web 项目 下一步是 ...

  10. 括号匹配问题(区间dp)

    简单的检查括号是否配对正确使用的是栈模拟,这个不必再说,现在将这个问题改变一下:如果给出一个括号序列,问需要把他补全成合法最少需要多少步? 这是一个区间dp问题,我们可以利用区间dp来解决,直接看代码 ...