iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么复用外部Shell脚本
  • 508
分享到

怎么复用外部Shell脚本

2023-06-15 19:06:41 508人浏览 安东尼
摘要

这篇文章主要为大家展示了“怎么复用外部shell脚本”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么复用外部Shell脚本”这篇文章吧。执行外部脚本的方式假如在当前目录有 a.sh 脚本,内容

这篇文章主要为大家展示了“怎么复用外部shell脚本”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么复用外部Shell脚本”这篇文章吧。

执行外部脚本的方式

假如在当前目录有 a.sh 脚本,内容如下

#!/bin/bash  echo "a.sh..."

在一个脚本中执行外部脚本主要有以下几种方式

  • source 外部脚本名字

在当前目录下的 b.sh 脚本,内容如下:

#!/bin/bash  source a.sh echo "b.sh..."

执行 ./b.sh,结果如下

[root@ecs-Centos-7 ~]# ./b.sh  a.sh... b.sh...

脚本中 source a.sh 命令 会先执行当前目录下的 a.sh脚本,所以结果会先输出 a.sh...再输出 b.sh脚本本身的打印

  • 点号 外部脚本名字

把 b.sh 脚本中执行a.sh脚本的语句修改成 点号 + 空格 + a.sh ,修改之后的脚本内容如下:

注意:点号和a.sh之间一定要加上空格,否则执行的时候会出错

#!/bin/bash  . a.sh echo "b.sh..."

执行 ./b.sh,结果如下

[root@ecs-centos-7 ~]# ./b.sh  a.sh... b.sh...

在上述脚本中, . a.sh 会先执行a.sh脚本, 结果会先输出 a.sh...再输出 b.sh...

  • sh 外部脚本名字

sh 外部脚本名字 和 ./外部脚本名字 两种方式是一样的,选择哪一种方式都没问题,下面是以前面一种方式为例说明的

把 b.sh 脚本中 source a.sh修改成 sh a.sh ,修改之后的脚本内容如下:

#!/bin/bash  sh a.sh echo "b.sh..."

执行 ./b.sh 命令, 结果如下

[root@ecs-centos-7 ~]# ./b.sh  a.sh... b.sh...

可以看出,结果输出和上面两种方式是一样的

三种方式的有什么区别

调用外部脚本有 source 外部脚本 、点号 外部脚本、sh 外部脚本 三种方式,它们之间有什么区别呢?

其中,source 外部脚本 和 点号 外部脚本 两种方式是相同的,当前脚本继承了外部脚本的全局变量和函数,  相当于把外部脚本的函数和全局变量导入了当前脚本中

修改 a.sh 和 b.sh 脚本, 内容如下

a.sh脚本

#!/bin/bash  VAR_A=10  func_a() {   echo "a.sh...pid:$$,param:$1" }

b.sh脚本

#!/bin/bash  source a.sh   func_a $1 echo "vara:$VAR_A" echo "b.sh...pid:$$"

执行 ./b.sh 5 命令,结果如下

[root@ecs-centos-7 ~]# ./b.sh 5 a.sh...pid:21485,param:5 vara:10 b.sh...pid:21485

两个脚本中的 $$ 是指执行脚本的进程ID,从结果可以看出,a.sh 和 b.sh 都是在同一个进程内执行的,所以在 b.sh 脚本中执行 source  a.sh 命令,会把 a.sh 脚本中的全局变量 VAR_A 和函数 func_a导入到 b.sh中

在 b.sh中打印变量 VAR_A,输出的值和 a.sh中相同,调用 func_a函数,输出也说明了调用的是 a.sh中的函数

source 外部脚本 、点号 外部脚本 两种方式是相同的, 所以, 把 b.sh 中 source a.sh 修改成 . a.sh , 执行  ./b.sh 5, 结果依然是相同的

由于 sh 外部脚本的方式是当前脚本和外部脚本在两个不同的进程中执行,所以当前脚本不能直接使用外部脚本中的函数和全局变量

修改 a.sh 和 b.sh 脚本, 内容如下

a.sh脚本

#!/bin/bash  test_a() {   echo "a.sh...test_a" }  echo "a.sh...pid:$$"

b.sh脚本

#!/bin/bash  sh a.sh  echo "b.sh...pid:$$"  test_a

执行 ./b.sh 命令,结果如下

[root@ecs-centos-7 ~]# ./b.sh  a.sh...pid:21818 b.sh...pid:21817 ./b.sh:行7: test_a: 未找到命令

从结果可以看出,执行 a.sh 和 b.sh 的进程ID是不同的,b.sh脚本进程找不到test_a函数,所以在b.sh中调用test_a 函数会提示  未找到命令

调用外部脚本中的函数

上一节讲到 sh 外部脚本 的方式无法直接使用外部脚本中函数和全局变量,下面提供几种方法可以解决这个问题

  • case 分支选择

这种方法类似于程序代码中的 switch case 语句,通过switch  选择不同的分支从而执行不同的逻辑,shell脚本中是使用case关键字来实现的

a.sh脚本

#!/bin/bash  VAR_A=10  test_a() {    echo "test_a..pid:$$,p1:$1,p2:$2" } get_var() {   echo ${VAR_A} }  case "$1" in     ta)       test_a $2 $3       ;;     var)       get_var       ;;    *)       echo "parameter err..." esac

b.sh脚本

#!/bin/bash  echo "b.sh...pid:$$"  sh a.sh ta 3 5  ret=$(sh a.sh var)  echo "ret:$ret"

执行 ./b.sh 命令,结果如下

[root@ecs-centos-7 ~]# ./b.sh  b.sh...pid:24813 test_a..pid:24814,p1:3,p2:5 ret:10

脚本b.sh一开始打印了调用自身的进程ID

sh a.sh ta 3 5 语句是调用a.sh脚本,传入的三个参数分别是ta, 3, 5 ,执行a.sh时,传入的第一个参数  ta经过case匹配之后调用 test_a函数,并把剩下的两个参数 3和5作为参数传入函数

ret=$(sh a.sh var) 语句时调用a.sh脚本,传入一个var  参数,经过case匹配之后调用get_var函数,该函数的作用输出脚本中全局变量VAR_A的值,语句中$()的作用是获取()中命令的返回值,这里是把a.sh脚本中  get_var函数的返回值赋值给 ret变量,所以该变量的值是 a.sh脚本中全局变量VAR_A的值

说明:如果想要获取函数的返回值,可以在函数中用 echo 打印相应的输出值,然后使用$(函数名 参数列表)可以获取到函数中打印的值,如上面b.sh脚本中  ret=$(sh a.sh var)语句,变量ret的值是 a.sh脚本中 get_var函数输出的值10

这里需要注意的是, 如果函数中有echo调试日志,那么调试日志也会一起返回

  • 函数调用模板

上面介绍的用 case 关键字去匹配调用不同的函数有一个缺点,每次a.sh脚本中增加一个函数的时候,case  就需要添加一个分支,分支里调用不同的函数,还需要注意函数是否有参数传入以及参数数量是否正确

我们可以在每个供外部调用脚本的尾部加上以下的语句,就可以解决上述问题, 具体语句如下

if [ $# -ge 1 ]; then    name="$1"    shift 1    $name "$@" fi

上述语句首先判断调用脚本时传入的参数数量,只有参数数量大于等于1才有效,传入的第一个参数表示函数名字,从第二个参数到最后一个参数都会作为参数传入到函数中

这里的 shift 1 是把传入脚本的参数左移一个位置,比如:传入脚本参数有 $1 $2 $3三个参数,左移一个位置之后, $2 移动到 $1  的位置,$3 移动到 $2 的位置,参数数量变为2了

原因: 传入脚本的参数中,第一个参数是函数名字,从第二个参数起才是函数的参数,如果不做左移处理,第一个参数函数名字也会作为参数传入到函数中

下面是完整的脚本内容

a.sh脚本

#!/bin/bash  VAR_A=10  test_a() {    echo "test_a..pid:$$,p1:$1,p2:$2" }  get_var() {   echo ${VAR_A} }  if [ $# -ge 1 ]; then    name="$1"    shift 1    $name "$@" fi

b.sh脚本

#!/bin/bash  echo "b.sh...pid:$$"  sh a.sh test_a 3 5  ret=$(sh a.sh get_var)

执行 ./b.sh 命令,结果如下

[root@ecs-centos-7 ~]# ./b.sh  b.sh...pid:25086 test_a..pid:25087,p1:3,p2:5 ret:10

可以看出,结果和上面 case 的方法是一样的

现在其他脚本中都可以通过 sh a.sh 函数名 参数列表 这样的方式调用 a.sh 脚本中的函数了,通过 $(sh a.sh 函数名  参数列表)的方式获取 a.sh脚本函数的返回值

  • 两者的优缺点

与case分支选择的方式相比,函数调用模板的优点是调用者只需要关心复用的脚本中函数名、函数传入参数、函数返回值就可以直接使用

缺点是如果有多个脚本都调用了复用脚本中的函数,当复用脚本中函数名变更时,需要修改所有调用了它的地方

函数调用模板方式的缺点恰恰是case分支选择方式的有点,case分支选择的方式时根据传入的字符串参数调用不同的函数,这里的字符串参数相当于函数的别名,只要这个参数保持不变,脚本中的函数名字可以任意变更

上述的优缺点比较只是一个相对的比较,实际应用中下不会很明显,大部分情况两种方式都可以使用

以上是“怎么复用外部Shell脚本”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 怎么复用外部Shell脚本

本文链接: https://www.lsjlt.com/news/281321.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么复用外部Shell脚本
    这篇文章主要为大家展示了“怎么复用外部Shell脚本”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么复用外部Shell脚本”这篇文章吧。执行外部脚本的方式假如在当前目录有 a.sh 脚本,内容...
    99+
    2023-06-15
  • Linux下怎么复用外部shell脚本
    这篇文章的内容主要围绕Linux下怎么复用外部shell脚本进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!在Linux开发中,经常会编写shell脚...
    99+
    2023-06-28
  • Linux下如何复用外部shell脚本
    这篇文章主要介绍Linux下如何复用外部shell脚本,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Linux开发中,经常会编写shell脚本来执行一些任务,通常是一个脚本只做一件事,随着任务的增加,脚本会越来越多,...
    99+
    2023-06-27
  • shell脚本怎么使用两个横杠接收外部参数
    小编给大家分享一下shell脚本怎么使用两个横杠接收外部参数,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!首先,效果是这样的:既可以处理短选项(-)又可以处理长选项(--)[developer@hadoop-cluster...
    99+
    2023-06-09
  • shell脚本引用外部变量的两种方法
    本地变量只能在当前bash进程中有效,对当前shell之外的其它进程,包括子进程均无效。而启动脚本实际就是开启一个子进程执行命令,所以,在脚本里就无法引用父进程上的本地变量。如下, 引用外部变量失败: [root@Cen...
    99+
    2023-05-06
    shell 引用外部变量 Shell 外部变量引用
  • sqlplus怎么执行外部脚本
    要在SQLPlus中执行外部脚本,可以使用@符号来引入外部脚本并执行。 假设你有一个脚本文件myscript.sql,你可以在SQL...
    99+
    2024-04-09
    sqlplus
  • shell脚本怎么用
    这篇文章主要介绍了shell脚本怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。shell脚本?在说什么是shell脚本之前,先说说什么是shell。shell是外壳的意...
    99+
    2023-06-09
  • Shell脚本中怎么调用和引用另外一个脚本文件
    这篇文章主要讲解了“Shell脚本中怎么调用和引用另外一个脚本文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Shell脚本中怎么调用和引用另外一个脚本文件”吧!脚本 first (测试示...
    99+
    2023-06-09
  • linux中怎么复制shell脚本
    在Linux中,要复制一个Shell脚本,可以使用cp命令来实现。cp命令用于复制文件和目录。 语法如下: cp [OPTION]....
    99+
    2024-02-29
    linux shell
  • 怎么用shell脚本一键部署LNMP架构
    本篇内容介绍了“怎么用shell脚本一键部署LNMP架构”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!LNMP架构介绍LNMP:Linux系...
    99+
    2023-06-09
  • 怎么使用Shell脚本自动部署项目
    这篇文章主要介绍了怎么使用Shell脚本自动部署项目的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Shell脚本自动部署项目文章都会有所收获,下面我们一起来看看吧。①:在Linux中安装Gityum&n...
    99+
    2023-07-05
  • Linux shell脚本怎么用
    这篇文章主要为大家展示了“Linux shell脚本怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux shell脚本怎么用”这篇文章吧。 Linux 脚本编写基础1 语法基本介绍1...
    99+
    2023-06-09
  • 怎么在linux中复制shell脚本
    在Linux中复制shell脚本可以使用cp命令。以下是复制shell脚本的基本语法:cp 源文件 目标文件其中,源文件是要复制的s...
    99+
    2023-09-15
    linux shell
  • 怎么用Linux shell脚本获取外网IP地址
    本篇内容介绍了“怎么用Linux shell脚本获取外网IP地址”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!基于Linux系统的获取外网I...
    99+
    2023-06-27
  • shell脚本实战之部署nginx脚本实例
    目录前言一键部署Nginx WEB平台(v1)版本一键部署Nginx WEB平台(v2)版本一键部署Nginx WEB平台(v4)版本: 增加IF语句使用信息总结前言 我们写脚本一定...
    99+
    2022-12-30
    nginx shell nginx项目部署 nginx 脚本
  • shell脚本中sed怎么用
    这篇文章主要介绍了shell脚本中sed怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。sed在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳过。...
    99+
    2023-06-09
  • shell怎么调用perl脚本
    要在shell中调用Perl脚本,需要执行以下步骤:1. 确保已经安装了Perl解释器。可以在终端中输入perl -v来检查Perl...
    99+
    2023-10-21
    perl shell
  • 怎么在Shell脚本中调用另一个脚本
    这期内容当中小编将会给大家带来有关怎么在Shell脚本中调用另一个脚本,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。forkfork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调...
    99+
    2023-06-09
  • 怎么用Tomcat安装shell脚本
    本篇内容主要讲解“怎么用Tomcat安装shell脚本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Tomcat安装shell脚本”吧!一、JAVA环境安装首先,要安装Tomcat,我们就...
    99+
    2023-07-02
  • Linux 中怎么使用Shell脚本
    Linux 中怎么使用Shell脚本,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Linux Shell脚本示例在Linux上完成的大多数shell脚本都涉及bash sh...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作