我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Linux下如何复用外部shell脚本

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Linux下如何复用外部shell脚本

这篇文章主要介绍Linux下如何复用外部shell脚本,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

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.sha.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.sha.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.sha.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.shfunc_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.sha.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.shb.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=语句时调用脚本,传入一个参数,经过匹配之后调用函数,该函数的作用输出脚本中全局变量的值,语句中()的作用是获取()中命令的返回值,这里是把a.sh脚本中 get_var函数的返回值赋值给 ret变量,所以该变量的值是 a.sh脚本中全局变量VAR_A的值

说明:如果想要获取函数的返回值,可以在函数中用 echo 打印相应的输出值,然后使用函数名参数列表可以获取到函数中打印的值,如上面脚本中(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 是把传入脚本的参数左移一个位置,比如:传入脚本参数有 2 三个参数,左移一个位置之后,2 移动到 的位置,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.shb.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脚本”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Linux下如何复用外部shell脚本

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

下载Word文档

猜你喜欢

Linux下如何复用外部shell脚本

这篇文章主要介绍Linux下如何复用外部shell脚本,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Linux开发中,经常会编写shell脚本来执行一些任务,通常是一个脚本只做一件事,随着任务的增加,脚本会越来越多,
2023-06-27

Linux下怎么复用外部shell脚本

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

怎么复用外部Shell脚本

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

linux下mysql如何自动备份shell脚本

Linux 服务器上的程序每天都在更新 MySQL 数据库,于是就想起写一个 shell 脚本,结合 crontab,定时备份数据库。其实非常简单,主要就是使用 MySQL 自带的 mysqldump 命令。#!/bin/bash # S
2022-06-04

如何编程Linux Shell脚本

本篇内容介绍了“如何编程Linux Shell脚本”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!从程序员的角度来看, Shell本身是一种用
2023-06-09

linux如何编写shell脚本

编写Linux的shell脚本可以使用任何文本编辑器,如vi、nano、gedit等。以下是编写shell脚本的一般步骤:1. 打开一个文本编辑器,创建一个新文件,文件扩展名通常是.sh,表示这是一个shell脚本。2. 添加#!/bin/
2023-09-15

如何理解Linux Shell脚本

本篇内容介绍了“如何理解Linux Shell脚本”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Shell简介诸多类Unix操作系统的设
2023-06-09

如何调试Linux shell脚本

shell也有一个真实的调试模式。如果在脚本"strangescript" 中有错误,您可以这样来进行调试: sh -x strangescript   这将执行该脚本并显示所有变量的值。   shell还有一个不需要执行脚本只是检查语法的
2022-06-04

Linux下shell通用脚本启动jar

Linux下shell通用脚本启动jar?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。vim app_jar.sh#!/bin/bash#source /etc/profi
2023-06-09

如何编写Linux Shell脚本

这篇文章主要为大家展示了“如何编写Linux Shell脚本”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何编写Linux Shell脚本”这篇文章吧。代码风格规范开头有“蛇棒”所谓sheba
2023-06-16

linux如何运行shell脚本

要运行一个Shell脚本,可以使用以下方法:1. 在终端中直接键入脚本的路径和名称,例如:```/path/to/script.sh```2. 给脚本文件添加执行权限,并使用./来执行脚本,例如:```chmod +x /path/to/s
2023-08-30

Linux下如何添加shell脚本执行权限

这篇文章主要为大家展示了“Linux下如何添加shell脚本执行权限”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux下如何添加shell脚本执行权限”这篇文章吧。创建脚本文件第一步是使用
2023-06-27

Linux下使用shell脚本自动执行脚本文件

以下实例本人在Centos6.5 64位操作系统中使用 一、定时复制文件a、在/usr/local/wfjb_web_back目录下创建 tomcatBack.sh文件文件内容:#将tomcat中的应用wfjb_web 复制到 /usr/l
2022-06-04

shell脚本引用外部变量的两种方法

本地变量只能在当编程客栈前bash进程中有效,对当前shell之外的其它进程,包括子进程均无效。而启动脚本实际就是开启一个子进程执行命令,所以,在脚本里就无法引用父进程上的本地变量编程客栈。如下, 引用外部变量失败: [root@Cento
2023-05-06

linux中如何编写shell脚本

在Linux中,可以使用任何文本编辑器编写Shell脚本。以下是编写Shell脚本的一般步骤:打开终端并创建一个新的文本文件,例如my_script.sh。在文件的第一行添加Shebang,指定要使用的Shell解释器。例如,要使用Bash
2023-10-23

如何使用linux shell脚本xargs命令

本篇内容主要讲解“如何使用linux shell脚本xargs命令”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用linux shell脚本xargs命令”吧!xargs是给命令传递参数的
2023-06-09

linux中shell脚本如何实现下载完关机

本篇内容主要讲解“linux中shell脚本如何实现下载完关机”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux中shell脚本如何实现下载完关机”吧!download_shutdown.
2023-06-09

Shell脚本如何使用

小编给大家分享一下Shell脚本如何使用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! shell前言Shell 能够接收用户输入的命令,并对命令进行处理,处理完毕后再将结果反馈给用户,比如输出到显示器、写入到文件等,这就
2023-06-15

Linux下如何使用Shell脚本实现ftp的自动上传下载

小编给大家分享一下Linux下如何使用Shell脚本实现ftp的自动上传下载,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1. ftp自动登录批量下载文件。代码如下:#####从ftp服务器上的/home/data 到 本
2023-06-09

编程热搜

目录