zoukankan      html  css  js  c++  java
  • Shell脚本exit用法与区别

    在Shell脚本中,往往会遇到一些判断类型为某个值不符合预期值的时候就退出主脚本/当前脚本/当前函数,那么Exitreturn的用法与区别是什么呢?

    下面先使用Exit举个简单例子,脚本内容如下

    #!/bin/bash
    if [[ "$1" == "1" ]];then
      echo "your input is $1"
    else
      echo '退出'
      exit 0
    fi
    echo '最后一句'

    第一种执行方法:

      使用Shell解析器进行调用,结果如下

    首先是BASH

    然后是sh

     

     接着是dash

     从上面的反馈结果来看,三个Shell解析器只有BASH能够无报错的执行完成,其他的则会提示语法错误,所以从这点可以看出:

    虽然都是Shell解析器,但是他们都有自己的标准,在大体上保持一致,但是某些细节上则会出现差异。

    那么下面继续见证另外三种执行方法

    第一种:.

     第二种:source

     第三种:./

     从上面所有案例可以得出一个不够严谨的结论(因为当前终端默认解析器就是BASH),所以出现了解析器调用法的时候,只有BASH能完美解析脚本,其他解析器都水土不服。

    在后面三种执行方法中,全部都顺利完成解析,但是这并不代表它们都一样,下面开始演示它们的区别(脚本内容增加一段)。

    下面的演示需要关注的重点是当前用户,具体请看演示:

    脚本内容更新如下:

     当前用户如下:

    开始演示,下面的演示与之前演示的区别在于第一参数的改变。

    第一个,依旧是BASH调用

    从反馈结果看,此时用户名变量不变

    然后跳过其他Shell解析器调用的测试,直接从.开始

     

     这时候可以看出,使用.的时候,遇到Exit的指令时,该指令会直接应用到当前终端环境,相当于在当前终端执行EXit的指令,接下来继续看其他方式

     结果依旧,然后继续使用./的方式

     这时候,结果与BASH解析器调用的结果一致,那么从这个结果中我们又可以得出一个结论:

    当脚本作为解析器调用文件的时候,此时整个脚本内容产生的效果之后应用于解析器调用的进程里,而不是当前终端环境,当使用source和一个.的方法执行的时候,脚本内容会直接对当前终端生效,而不是某个应用进程。虽然这是一个小小的区别,但却是一个非常实用的功能。

  • 相关阅读:
    C#yield return用法示例
    C#多线程示例
    AspNetCore.Authentication
    C#委托与事件
    按值和按引用传递参数
    基于iView的无限级菜单
    Sortable By Attribute
    未能加载文件或程序集“BLL”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集。
    有关导出Excel特殊字符的问题
    openFileDialog的使用
  • 原文地址:https://www.cnblogs.com/liuyi778/p/12300380.html
Copyright © 2011-2022 走看看