本来要写一下shell的if/else语句来着,不过,感觉还是应该先把shell的退出状态和返回先交代一下,这样会更方便理解。

shell的流程控制语句和”条件”是密切联系在一起的。

而shell语法区别其他编程语言的唯一方面是“条件”实际上是语句列表而不是一般的布尔(真或假)表达式。

那么如何判断条件的真或假?这就是我这篇日志要告诉你的:命令的退出状态及返回。

每个UNIX命令,当其结束时都对其调用进程(这里就是SHELL啦)返回一个整数值。这成为退出状态。

0通常为无错退出状态,而其他(1-255)通常表示错误。(但是有特例的,比如:diff这里不讨论)

if检查if关键字后的列表中最后一个语句的退出状态:

这倒是挺有意思的,看一下下面的逻辑

if command运行成功
then
    正常处理
else
    错误处理

如书中给了一个有BUG的例子,当然这是作者有意为之的了,

pushed()
{
        dirname=$1
        DIR_STACK="$dirname ${DIR_STACK:-$PWD' '}"
        cd ${dirname:?"missing directory name."}
        echo $DIR_STACK
}

此函数模拟shell的方法,将访问过的路径入栈操作。第三行,当没有为其传递参数的时候,会输出错误信息。

但是如果参数不是有效的路径,也会蒙混过关。下面用if语句来处理此BUG。

有心人已经看出来,上面的例子用到了我前面讲过的shell的字符串操作,模式匹配,及命令替换,在这里佩服一下原作者。。

pushed()
{
        dirname=$1
        if cd ${dirname:?"missing directory name."}     # 如果cd成功,这里判断cd的退出状态
        then
                DIR_STACK="$dirname ${DIR_STACK:-$PWD' '}" # 该目录入栈
                echo $DIR_STACK
        else
                echo still in $PWD                        # 要不然就沙也不干
        fi
}

shell_pushed截图

有的时候,我们保存这个条件的退出状态是有必要的:

有两种方法能完成此工作,其一是特殊的shell变量‘?’,其返回运行的最后一个命令的退出状态

# 路径真实存在,返回cd的状态为0
cd /etc/
echo $?

# 路径不存在,返回cd的状态为1
cd /simaopig/
echo $?

其二,就是这篇日志标题里的“返回”语句,return,exit

return N ,使得返回它的函数以状态N退出,N是可选的,其默认为最后一个命令的退出状态(即与$?相同)

没有以return 语句结束的函数,将返回最后一个语句的返回的状态,

return只能用在函数及使用source执行的shell脚本内。

相比较,语句exit N将退出整个脚本,不管你函数有多少层。

cd() {
        builtin cd "$@"
        es=$?
        echo "$OLDPWD --> $PWD"
        return $es
}

shell_cd截图

这里值得一提的是,builtin告诉shell使用内置命令并忽略改名字的任何函数。有兴趣的同学可以自己去man一下。

PS:这篇日志打字费了我45分钟,只有拼音输入法,没有五笔,郁闷了。。

linux linux, shell

相关文章

shell if else相关推荐

  1. jar包部署shell脚本编写,在服务器上部署jar包,在Linux服务器上部署服务,设置编码格式,设置内存管理

    准备步骤: 1.安装java环境,知道java安装目录 2.将jar包拖放或发送至服务器中(目录自定义) 一.编写shell脚本,将以下代码放在shell脚本中,将shell脚本放在jar包同级目录下 ...

  2. Linux shell 学习笔记(16)— shell 入门总结

    1. Shell 变量 Shell 变量包括自定义变量和环境变量: 自定义变量:脚本中自己命名定义的变量,通常为局部变量,其他 Shell 程序不能访问到: 环境变量,操作系统已定义的变量,如 PAT ...

  3. 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行

    1. shell 相关 1.1 默认 shell Makefile 所使用的命令是由 shell 命令行组成,他们是一条一条执行的. 多个命令之间要使用分号隔开,Makefile 中的任何命令都要以 ...

  4. Linux shell 学习笔记(12)— linux 信号、后台运行脚本、作业控制、定时运行任务

    1. 处理信号 1.1 Linux 信号 常见的 Linux 信号如下表所示: 信号 值 描述 1 SIGHUP 挂起进程 2 SIGINT 终止进程 3 SIGQUIT 停止进程 9 SIGKILL ...

  5. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)

    1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...

  6. Linux shell 学习笔记(10)— 处理用户输入(命令行读取参数、读取用户输入、超时处理)

    1. 命令行参数 向 shell 脚本传递数据的最基本方法是使用命令行参数.命令行参数允许在运行脚本时向命令行添加数据. $ ./addem 10 30 本例向脚本 addem 传递了两个命令行参数( ...

  7. Linux shell 学习笔记(9)— 循环语句(for、while)以及更改字段分隔符

    1. for 语句 bash shell 中 for 命令的基本格式如以下,$var 变量包含着这次迭代对应的当前列表项中的值. for var in list docommands done 也可以 ...

  8. Linux shell 学习笔记(8)— 使用结构化命令(if-then 语句、数值比较、字符串比较、文件比较、case 语句)

    1. 使用 if-then 语句 最基本的结构化命令就是if-then语句.if-then语句有如下格式. if command then ​ commands fi 或者 if command; t ...

  9. Linux shell 学习笔记(7)— 构建基本脚本(变量、重定向、管道、状态码)

    1. 使用多个命令 如果要两个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开. $ date ; who Mon Feb 21 15:36:09 EST 2014 Christine tty2 ...

  10. Linux shell 学习笔记(5)— 文件权限(添加、修改、删除用户及创建、修改群组)

    1. Linux的安全性 Linux 安全系统的核心是用户账户.每个能进入 Linux 系统的用户都会被分配唯一的用户账户.用户对系统中各种对象的访问权限取决于他们登录系统时用的账户. 用户权限是通过 ...

最新文章

  1. 数据分析 python 用途-想做好数据分析,不用Python怎么行?
  2. 极力推荐5款我一直在使用的Chrome优秀插件!
  3. jQuery.sap.declare(cus.crm.notes.ext.Component);
  4. MySQL数据库分布式事务XA实现原理分析
  5. Java并发线程之线程池
  6. opencv之在图像上绘制标记---drawMarker
  7. HDU4548 美素数【水题】
  8. 关于require,require_once,include和include_once的区别
  9. spring boot 拦截器 或 Spring AOP 方式记录请求日志
  10. 30天自制操作系统光盘_8-bit Windows 八位机视窗操作系统(四):科王/邦谷Wins98...
  11. unix文件中i节点
  12. [HYSYS学习]逻辑单元-循环器
  13. 网络操作系统项目教程----Windows server 2003篇----打印机安装与配置
  14. js日历控件html,第11款插件:jquery.jCal.js显示日历插件
  15. 站在巨人的肩膀上,C++开源库大全
  16. python cnn 回归模型_【深度学习系列】CNN模型的可视化
  17. 抖音测试软件app,抖音抑郁症测试app
  18. 索尼xz1c 日版融卡扩容经验分享(无需root,索尼XZP机型也适用)
  19. 利用c语言绘制漫天星空-动画
  20. vsftpd安装以及配置FTP虚拟用户实践

热门文章

  1. c语言实参的默认存储类型,2016下半年软考程序员练习习题及答案解析(一)
  2. java程序分为哪两大类_JAVA程序基础(第1-2章分类)复习-1
  3. 提升PHP性能使用细节
  4. mysql的实验环境_第04 章 MYSQL实验环境创建
  5. ca 自建 颁发证书_openssl自建CA后颁发证书
  6. c mvc ajax请求,springMVC的ajax请求
  7. python增删改查人名管理_python3字典列表的增删改查(名片管理系统函数版)
  8. 高德地图2020最新版下载导航wince_导航定位错误致青城山严重拥堵,高德地图回应:已优化...
  9. HackerRank:JavaScript 是最知名的编程语言
  10. 11.保存登录状态与注销功能