1. shell脚本的执行
  当shell脚本以非交互的方式运行时,它会先查找环境变量ENV,该变量指定了一个环境文件(通常是.bashrc),然后从该环境变量文件开始执行,当读取了ENV文件后,shell才开始执行shell脚本中的内容。
  shell脚本的执行通常可以采用以下三种方式:
    ①. Bash script-name 或sh script-name (推荐使用)
    ②. Path/script-name 或./script-name (当前路径下执行脚本)
    ③. Source script-name 或 .script-name #注意“.”点号。
  执行说明
  第一种方法是当脚本文件本身没有可执行权限(即文件X位为-号)时常使用的方法,这里推荐用bash执行,或者文件开头没有指定解释器
  第二种方法需要先将脚本文件的权限改为可执行(即文件加X位),具体方法:chmod u+x script-name 或 chmod 755 script-name 。然后通过脚本路径就可以直接执行脚本了。
  第三种方法通常是使用 source或者“,”点号读入或加载指定的shelll脚本文件(san.sh),然后,依次执行指定shell脚本文件san.sh中的所有语句。这些语句将作为父shell脚本father.sh进程的一部分运行。因此,使用source或者“.”点号可以将san.sh自身脚本中的变量的值或函数等的返回值传递到当前的父shell脚本father.sh中使用。这是第三种方法和前两种方法的最大区别,也是值得读者注意的地方。
  source或者“."点号命令的功能是在当前shell中执行source或者“.”点号加载并执行的相关脚本文件中的命令及语句,而不是产生一个子shell来执行命令文件中的命令。
  下面我们举例说明:

[root@yanwei-test1 scripts]# cat test.sh
echo 'I am oldboy'

 输入“echo ‘I am oldboy”内容后按回车,然后在按ctrl+d组合建即可结束编程。此操作作为特殊编辑方法,作为cat用法的扩展知识提及(老男孩PS:在使用中去记忆是个好习惯)

[root@yanwei-test1 scripts]# cat test.sh
echo 'I am oldboy'
[root@yanwei-test1 scripts]# sh test.sh #使用第一种方式的sh命令执行test.sh脚本文件
I am oldboy
[root@yanwei-test1 scripts]# bash test.sh #使用第一种方式的sh命令执行test.sh脚本文件
I am oldboy

 我们使用第一种方法,发现均可以执行并得到了预期的结果。

[root@yanwei-test1 scripts]# ./test.sh     #使用第二种方式“./”在当前目录下执行test.sh脚本文件,细心的读者可以发现,这个地方无法自动补全。
-bash: ./test.sh: 权限不够 #提示:权限拒绝,此处因为没有执行权限
[root@yanwei-test1 scripts]# chmod +x test.sh
[root@yanwei-test1 scripts]# ./test.sh
I am oldboy

但是可以用source或者"."点号执行

[root@yanwei-test1 scripts]# . test.sh    #请注意,这里“.”执行,必须有空格
I am oldboy
[root@yanwei-test1 scripts]# source test.sh
I am oldboy

我们看到,给test.sh加完可执行权限就可以执行了
  现在测试第三种方法source或者“.”点号的特殊的传递变量值到当前shell的例子

[root@yanwei-test1 scripts]# echo 'userdir=`pwd`' > testsource.sh #一行的内容通常用echo编辑很方便
[root@yanwei-test1 scripts]# cat testsource.sh
userdir=`pwd`
[root@yanwei-test1 scripts]# sh testsource.sh
[root@yanwei-test1 scripts]# echo $userdir
#此处为空,并没有出现当前路径输出,这是为什么呢?

  根据上面例子,我们可以发现,通过sh或bash命令执行过的脚本,脚本结束后在当前shell窗口查看userdir变量的值,发现值是为空的,现在以同样的步骤改用source执行,然后再看看userdir变量的值。

[root@yanwei-test1 scripts]# source testsource.sh
[root@yanwei-test1 scripts]# echo $userdir
/server/scripts

结论:通过source或“.”点号加载执行过的脚本,在脚本结束后脚本中的变量(包括函数)值在当前shell中依然存在,而sh和bash则不行。因此,在做shell脚本开发时,如果脚本中有需求引用其他脚本的内容或者配置文件时,最好用“.”点号或source在脚本开头加载该脚本或配置文件,然后在下面的内容用可以调用source加载的脚本及文件中的变量及函数等内容。
    某互联网公司linux运维职位实际面试笔试填空题:

已知如下命令及返回结果,请问echo $user的返回的结果为( )
[root@yanwei-test1 scripts]# echo 'user=`whoami`' >whoamisource.sh
[root@yanwei-test1 scripts]# cat whoamisource.sh
user=`whoami`
[root@yanwei-test1 scripts]# sh whoamisource.sh
[root@yanwei-test1 scripts]# echo $user 答案:
1、当前用户
2、空(无内容输出) #这个是正确答案

  

shell-脚本的执行的更多相关文章

  1. Shell脚本中执行mysql的几种方式(转)

    Shell脚本中执行mysql的几种方式(转) 对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用 ...

  2. shell脚本循环执行mysql语句

    参考资料:Shell脚本中执行mysql语句 需求:数据库里有张数据表存储的是用户对电影的评价(user_id movie_id rating time),但是我现在要每部电影的总评分. 解决方法: ...

  3. shell脚本中执行另一个shell脚本

    分类: 可以在一个shell脚本中执行另一个shell脚本(或非可执行文件,主要用于取得一些变量的值),方法是: . 文件名(包括路径) 或 变量=文件名(包括路径) . $变量   注意,圆点后面有 ...

  4. Shell脚本中执行sql语句操作mysql的5种方法【转】

    对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...

  5. shell脚本实现监控shell脚本的执行流程及变量的值

    这篇文章主要介绍了shell脚本实现监控shell脚本的执行流程及变量的值本文使用shell完成对执行过程中条件语句中的变量的变化的监控和整个程序的执行流程的观察功能,需要的朋友可以参考下 很多时候, ...

  6. shell脚本中执行sql的例子

    这个例子演示了如何在shell脚本中执行多个sql来操作数据库表. #! /bin/sh USER_HOME=/home/`whoami` . /etc/profile if [ -f ${USER_ ...

  7. 使用shell脚本定时执行备份mysql数据库

    使用shell脚本定时执行备份mysql数据库 #!/bin/bash ############### common file ################ #本机备份文件存放目录 MYSQLBA ...

  8. shell脚本批量执行命令----必需判断上一步执行结果--没有捷径

    # 注意:shell脚本批量执行命令,不能只写一个函数,然后把所有命令复制进去,之前试过这样是不行的.必须要有一个判断命令执行成功与否的语句 # 简单的命令可以不加结果判断符号,但是遇到解压包.sed ...

  9. 如何解决 shell 脚本重复执行的问题

    在开发过程中,经常会使用shell脚本去完成定时备份的任务,普遍的做法是通过系统的定时任务定时执行备份脚本 设想这样一种场景,本次备份时间到了,自动执行备份脚本,如果备份比较耗时的话,会一直持续到下一 ...

  10. shell脚本中执行source命令不生效的解决办法

    一个shell脚本文件中有一个source命令,使用bash a.sh命令执行后source命令进行验证没有生效. 这是因为在shell脚本中执行source会看到效果,但是shell脚本执行完后再次 ...

随机推荐

  1. Java使用POI的SXSSFWorkbook与HSSFWorkbook导出复杂表头

    一.HSSFWorkbook与SXSSFWorkbook的区别: HSSFWorkbook是对Excel2003以前的版本进行操作的,即后缀名为.xls SXSSFWorkbook时对Excel200 ...

  2. 保存vuex状态刷新不消失

    写在App.vue中,所有页面共享此方法 export default { name: "app", components: {}, created() { // 页面每次刷新加载 ...

  3. ubuntu 18.04下修改python3指向

    起因 ubuntu18.04下默认带的是python3.6,但是因为需求需要升级为python3.7 步骤 安装 sudo apt install python3.7 修改环境变量 修改默认的pyth ...

  4. 7.SwrContext音频重采样使用

    头文件位于#include <libswresample/swresample.h>   SwrContext常用函数如下所示 SwrContext *swr_alloc(void); / ...

  5. C#封装YOLOv4算法进行目标检测

    C#封装YOLOv4算法进行目标检测 概述 官网:https://pjreddie.com/darknet/ Darknet:[Github] C#封装代码:[Github] YOLO: 是实现实时物 ...

  6. (超详细)动手编写-链表(Java实现)

    目录 前言 概念 链表的设计 完整代码 List接口 抽象父类设计 链表-LinkedList 虚拟头结点 概念 结构设计 方法变动 双向链表 概念 双向链表设计 方法变动 循环链表 单向循环链表 双 ...

  7. sqli-labs 1-10关

    学习sql注入的必做靶场我终于来尝试一下下了. 第一关 ?id=1'时出现 在测试?id=1' and '1'='1,页面正常 ?id=1' and '1'='2  页面错误 判断存在单引号字符型注入 ...

  8. [极客大挑战 2019]Havefun wp

    很少见的很简单的一道题 查看源代码 获得一段被注释的代码 直接?cat=dog即可得flag

  9. 居然仅用浏览器,就完成了Spring Boot应用的开发与部署!

    最近有幸试用了一下阿里云的一个新产品:云开发平台,体验一把全新的开发模式!虽然中间也碰到了一些问题,但整体的体验透露着未来感,因为整个过程都不需要使用我们最常用的IDEA,仅依靠浏览器就把一个Spri ...

  10. JVM运行时数据区划分

    Java内存空间 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了JAVA在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳 ...