千家信息网

Linux下怎么复用外部shell脚本

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章的内容主要围绕Linux下怎么复用外部shell脚本进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!在
千家信息网最后更新 2025年11月07日Linux下怎么复用外部shell脚本

这篇文章的内容主要围绕Linux下怎么复用外部shell脚本进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!


在Linux开发中,经常会编写shell脚本来执行一些任务,通常是一个脚本只做一件事,随着任务的增加,脚本会越来越多,可复用的地方也会逐渐增加,这时就需要提取出脚本中的公共的功能放到一个通用的脚本中,其他脚本都能复用它

下面介绍shell脚本中如何执行外部脚本,如何调用外部脚本中的函数,以及脚本复用相关的方法

执行外部脚本的方式

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

#!/bin/bashecho "a.sh..."

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

source 外部脚本名字

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

#!/bin/bashsource a.shecho "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.shecho "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/bashsh a.shecho "b.sh..."

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

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

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

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

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

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

a.sh脚本

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

b.sh脚本

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

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

[root@ecs-centos-7 ~]# ./b.sh 5a.sh...pid:21485,param:5vara:10b.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/bashtest_a(){  echo "a.sh...test_a"}echo "a.sh...pid:$$"

b.sh脚本

#!/bin/bashsh a.shecho "b.sh...pid:$$"test_a

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

[root@ecs-centos-7 ~]# ./b.sh a.sh...pid:21818b.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/bashVAR_A=10test_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/bashecho "b.sh...pid:$$"sh a.sh ta 3 5ret=$(sh a.sh var)echo "ret:$ret"

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

[root@ecs-centos-7 ~]# ./b.sh b.sh...pid:24813test_a..pid:24814,p1:3,p2:5ret: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/bashVAR_A=10test_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/bashecho "b.sh...pid:$$"sh a.sh test_a 3 5ret=$(sh a.sh get_var)

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

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

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

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

两者的优缺点

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

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

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

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

感谢你的阅读,相信你对"Linux下怎么复用外部shell脚本"这一问题有一定的了解,快去动手实践吧,如果想了解更多相关知识点,可以关注网站!小编会继续为大家带来更好的文章!

脚本 函数 参数 方式 结果 变量 命令 输出 内容 名字 语句 复用 不同 全局 分支 进程 选择 相同 位置 数量 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 传统计算机网络技术的类型 太原软件开发专业定制 网络安全普法手抄报文字 学习网络技术对我们的意义 数据库外模式保证了 王牌战争更安全的服务器 普元有没有自己的数据库 垠坤集团的软件开发怎么样 网络安全攻击技术最新 服务器可以使用pe安装吗 绵阳 网络技术有限公司 dhcp服务器发放地址原理 甘肃电信服务器地址云空间 海康威视管理服务器主要参数 中国四大服务器芯片 猿宝互联网科技有限公司 手机无法连接网络和服务器怎么办 网络安全课程 精品 数据库ora si 网络技术科 主管职责 慈溪一站式软件开发管理 网络技术部门工作流程图 丰台区正规软件开发检修 有关网络安全建设的论文 数据库查询时的变量怎么用 网络安全专业课程的书 深圳巡检软件开发 戴尔服务器修改管理员密码 连接不上服务器安全组设置 手机无法连接网络和服务器怎么办
0