shell 如何调用多个脚本

简介

    这篇文章主要描述如何通过主脚本去调用其他脚本中的方法,调用的过程中可能出现哪些坑,如何避免。

        

目录

1. 主脚本调用其他脚本的方法

1.1. bash方法

1.2. source方法

2. 避坑技巧

2.1. 路径配置无效

2.2. source变量冲突

3. 总结


        

1. 主脚本调用其他脚本的方法

使用主脚本调用其他脚本通常使用2种方法:

  • bash 脚本名
  • source 脚本名

还有一种 . 脚本名 的方法与 source 脚本名 差不多,但偶尔会出现无法调用的问题,这里就不解释了。

1.1. bash方法

使用传统的 bash 方法就是在当前脚本中执行 bash 去调用另一个脚本。来看一下例子

【主脚本代码】

#!/bin/bash
echo "============= 我是主脚本, 准备去调用其他脚本 ============="bash ./scr.sh    # 调用其他脚本echo "============= 我是主脚本, 其他脚本已执行完成 ============="

【另一个脚本代码】

#!/bin/bash
echo "我是其他脚本"

来执行主脚本,看一下结果:可以正常调用

        

这种方法虽然可以调用另一个脚本,但另一个脚本却无法共享主脚本的变量

【主脚本代码】

#!/bin/bash
var=10    # 定义一个变量
echo "我是主脚本, 变量var的值是: ${var}"bash ./scr.sh    # 调用其他脚本

 【另一个脚本代码】

#!/bin/bash
echo "我是其他脚本, 变量var的值是: ${var}"

主脚本中定义的变量无法作用到其他脚本中

        

虽然这里的变量无法作用到其他脚本,但可以通过传参的方式拿过去

 【主脚本代码】

#!/bin/bash
var=10
echo "我是主脚本, 变量var的值是: ${var}"bash ./scr.sh "${var}"    # 向另一个脚本传递参数

 【另一个脚本代码】

#!/bin/bash
var="$1"    # 接收一个位置参数
echo "我是其他脚本, 变量var的值是: ${var}"

结果如下:参数传递成功

注意:这种方法只适用于少量参数

        

1.2. source方法

source 与 bash 方法完全不同,bash 是直接去执行另一个脚本,而 source 是将另一个脚本的代码读取过来。还记得为什么配置环境变量到 ~/.bashrc 后,需要执行 source ~/.bashrc 才生效吗,就是为了将 ~/.bashrc 中的配置信息读取到本地才能生效,所以使用 source 执行其他脚本文件也是同样的道理。

使用与上面同样的方法,在主脚本中配置一个变量,然后 source 另一个脚本

 【主脚本代码】

#!/bin/bash
var=10
echo "我是主脚本, 变量var的值是: ${var}"source ./scr.sh    # 调用其他脚本

 【另一个脚本代码】

#!/bin/bash
echo "我是其他脚本, 变量var的值是: ${var}"

        

为什么说 source 是将另一个变量的代码读取到本地,看一下这个例子就明白了。

 【主脚本代码】

#!/bin/bash
echo "我是主脚本"source ./scr.sh    # 调用其他脚本
Func    # 调用另一个脚本的函数

 【另一个脚本代码】

#!/bin/bash
# 只定义函数,不调用
Func(){echo "我是另一个脚本的函数Func"}

我们在主脚本中使用 source 另一个脚本后,在主脚本调用另一个脚本中的函数。而在另一个脚本中只定义函数,不调用。

  • 通过这两个例子可以确定,使用 source 后,两个脚本的变量和函数都可以共用。需要共享变量较多时,使用 source 最佳。

        

2. 避坑技巧

2.1. 路径配置无效

在平时写代码时,一般会指定一个当前路径。喜欢用 pwd 的伙伴注意了,这会出现问题。

  【主脚本代码】

#!/bin/bash
init_path=$(pwd)    # 使用pwd来定义当前路径
scr_path="${init_path}/scr.sh"  # 通过当前路径连接另一个脚本的路径echo "我是主脚本"source ${scr_path}    # 调用其他脚本

 【另一个脚本代码】

#!/bin/bash
echo "我是另一个脚本"

在当前路径下执行是没问题的

但如果我们当前是在另一个路径下,无法调用另一个脚本

看吧,报了一个找不到文件的错误,而且路径也不是我们希望的那个位置。这是因为脚本中使用 pwd 定义初始路径导致的问题,pwd 这个命令表示当前终端在哪个路径下,而不是脚本在哪个路径下,所以在执行时路径发生了变化。

        

要解决这个问题也非常简单,将 pwd 改成

init_path=$(dirname $0)    # dirname $0 表示脚本的目录

或者

init_path=$(dirname ${BASH_SOURCE})

使用 $0 后,主脚本只能使用 bash 执行,使用 source 报错

使用 ${BASH_SOURCE} 同时支持 bash 和 source

        

2.2. source变量冲突

在前面的《目录 1.2》中提到过,source 另一个脚本后,变量和函数是共享的,所以也会导致变量被修改。

   【主脚本代码】

#!/bin/bash
var=10echo "我是主脚本, 当前var为: ${var}"source ./scr.sh    # 调用其他脚本echo "我是主脚本, 调用另一个脚本后, 当前var为: ${var}"

 【另一个脚本代码】

var=20
echo "我是另一个脚本, 这里的var为: ${var}"

由于变量共享,所以其他脚本的全局变量名与当前脚本的全局变量名相同的话,是会被修改的。

        

避免的方法

  1. 如果不需要共享变量的情况下,建议使用 bash,不使用 source
  2. 如果需要共享大量变量的情况下,使用 source,但非主脚本的变量全部定义为局部变量。

    【主脚本代码】

#!/bin/bash
var=10echo "我是主脚本, 当前var为: ${var}"source ./scr.sh    # 调用其他脚本echo "我是主脚本, 调用另一个脚本后, 当前var为: ${var}"

 【另一个脚本代码】

Func(){local var=20    # 定义局部变量echo "我是另一个脚本, 这里的var为: ${var}"}
Func

非主脚本的代码都使用函数封装,并且将所有变量定义为局部变量,即使变量名称相同也不会发生冲突。

        

3. 总结

1、当需要共享大量变量的情况下,使用 source 调用另一个脚本。但另一个脚本的代码尽量都使用函数封装,将函数中的变量定义为局部变量,避免名称冲突。

2、当不需要共享变量时,或者少量变量时,可以使用 bash 调用另一个脚本。当然,这还是看个人习惯吧。

3、不论是主脚本还是其他脚本,都可以 source 或 bash 多个其他脚本。如果是 source,则全部共享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

es对已有的索引给主键_ES中对索引的相关操作

写在前面:本文ES版本为:6.4.2(单机),并安装了head插件,运用postman进行操作。也可以使用head插件在前端浏览器中进行傻瓜式操作,后续会介绍这种方式!如果没有安装es和head插件的话,请先安装&…

“华为云-东吴杯”圆满成功,顶尖参赛者推动“智造”场景结构升级

2021年10月9日,“华为云-东吴杯”2021数字化转型创新应用大赛(以下简称“华为云-东吴杯”)的最终决赛如期上演,给来自创客赛道和企业赛道的顶尖开发者及团队搭建了一个绝佳的舞台,令其充分展示投身数字化转型领域所获得…

云原生下的灰度体系建设

简介: 本篇文章,我们将继续为大家介绍 ASI SRE(ASI,Alibaba Serverless infrastructure,阿里巴巴针对云原生应用设计的统一基础设施) 是如何探索在 Kubernetes 体系下,建设 ASI 自身基础设施在大…

引用和指针的区别都有什么_C++指针与引用的区别

指针与引用是C中两个很重要的概念,它们功能看过去很相似,就是都是间接引用某个对象,那么我们应该在什么时候使用指针,什么时候使用引用呢,下面请允许我慢慢道来:1.永远不要使用一个指向空值的引用。一个引用…

混合云K8s容器化应用弹性伸缩实战

简介: 混合云K8s容器化应用弹性伸缩实战1. 前提条件 本最佳实践的软件环境要求如下: 应用环境: ①容器服务ACK基于专有云V3.10.0版本。 ②公共云云企业网服务CEN。 ③公共云弹性伸缩组服务ESS。 配置条件: 1)使用专有云…

lodop打印不显示页码_Excel|13个Excel打印技巧汇总,打印技巧大全

打印技巧是工作必备,无需理由!很多时候大家得不到想要的打印效果,偶尔打印一两张表格,会出现各种状况:标题行不见了?打印范围错了?页眉页脚不对?打印一个内容,总得弄出一…

关于写好文章的3个心法和5点技巧

简介: 技术类文章最需要的是扎实的经验累积、深度思考和精益求精的精神,这些技巧,希望能够锦上添花。 作者 | 双宏 来源 | 阿里技术公众号 我是双宏,负责阿里巴巴内部技术人社区的内容运营,包括每天头条热文专题推荐、…

工商银行分布式服务 C10K 场景解决方案

简介: Dubbo 是一款轻量级的开源 Java 服务框架,是众多企业在建设分布式服务架构时的首选。中国工商银行自 2014 年开始探索分布式架构转型工作,基于开源 Dubbo 自主研发了分布式服务平台。 作者 | 颜高飞 来源 | 阿里巴巴云原生公众号 Dubb…

matlab cell转数组_MATLAB批量修改文件名

评论区旁友建议使用narsort排序而不是直接修改文件名。我觉得相关条件下也可以,所以原文末尾加上了narsot排序法。以下是原文2019-05-09最近实验室小可爱帮忙做实验和记录实验数据,不过新手总有些错误操作,比方说因为忘记修改存储路径导致图片…

Spring Cloud Bus 消息总线介绍

简介: 本文配套可交互教程已登录阿里云知行动手实验室,PC 端登录 start.aliyun.com 在浏览器中立即体验。 作者 | 洛夜 来源 | 阿里巴巴云原生公众号 本文配套可交互教程已登录阿里云知行动手实验室,PC 端登录 start.aliyun.com 在浏览器中立…

更灵活的边缘云原生运维:OpenYurt 单元化部署新增 Patch 特性

简介: 在正文开始之前,我们先回顾一下单元化部署的概念和设计理念。在边缘计算场景下,计算节点具有很明显的地域分布属性,相同的应用可能需要部署在不同地域下的计算节点上。 作者 | 张杰(冰羽) 来源 | 阿里…

Gartner:2022年全球IT支出将超4万亿美元,软件增速最高

编辑 | 宋慧 供稿 | Gartner 根据Gartner的最新预测,2022年全球IT支出预计将达到4.5万亿美元,相比2021年增长5.5%。 Gartner杰出研究副总裁John-David Lovelock表示:“越来越多的企业将构建新技术和软件,而不是购买和部署它们&am…

Flink 实时计算在微博的应用

简介: 微博通过将 Flink 实时流计算框架跟业务场景相结合,在平台化、服务化方面做了很大的工作,在开发效率、稳定性方面也做了很多优化。我们通过模块化设计和平台化开发,提高开发效率。 微博机器学习研发中心数据计算负责人&…

移动云帮我养出了一片致富鱼塘

“通过U鱼智慧管理平台,水产养殖由‘人治’转变为‘智治’,养得舒心、卖得放心、吃得安心。”广东省渔业种质保护中心相关负责人表示。准确研究,提升科学养殖水平广东省渔业种质保护中心坐落于广州市南沙区东涌镇,占地580亩&#…

sketch里的ios控件_使用Sketch建立Design System

一、 有关Design System之前的文章《使用Adobe XD建立Design System》中介绍了什么是Design System,它有什么用,在设计的哪个阶段使用以及如何用Adobe XD来搭建。这篇文章主要侧重在UI风格已确定的设计后期,用Sketch工具来搭建一个Design Sys…

论好文章和烂文章

简介: 我们为何写作?对于许多技术同学来说,写作是一件比写代码困难许多的事情,和电脑相顾无言数小时,发现自己写不出什么像样的东西来,着实不是一种很好的体验。 作者 | 许晓斌 来源 | 阿里巴巴云原生公众号…

好代码实践:基于Redis的轻量级分布式均衡消费队列

简介: 好代码,给人第一个印象的感觉,就像一篇好文章一样,读起来朗朗上口。不同的文章有不同的风格体裁,不同的代码也有不同的编程风格要求。Python有严格的缩进,像诗歌一样工整对仗;C语言面向过…

浅析低功耗广域网及在智慧城市中的应用

作者 | 沈建华、冷咏雪根据知名物联网分析机构IoT Analytics预测,到2025年,物联网连接数将达到非物联网连接数的3倍。低功耗广域网(LPWAN)作为物联网连接的核心基础设施,其业务特点是发送数据极小,并且为了维持电池供电设备的长时…

rocketmq怎么保证数据不会重复_RocketMQ保证信息有序性和防止重复

分布式开放消息系统(RocketMQ)的原理与实践分布式消息系统做为实现分布式系统可扩展、可伸缩性的关键组件,须要具备高吞吐量、高可用等特色。而谈到消息系统的设计,就回避不了两个问题:java消息的顺序问题消息的重复问题RocketMQ做为阿里开源…

云效Codeup代码评审中的代码协同

简介: 云效 Codeup 汇集了阿里巴巴最新的代码托管、代码协同技术,希望能够造福更多中国和世界的开发者。 大神说:“Show me the code”,于是就有了代码评审。 “Talk is cheap. Show me the code.” ——Linus Torvalds, founder …