首页
学习
活动
专区
工具
TVP
发布

Shell运行脚本中指定函数

Shell脚本中的函数规定先定义在先使用在后,违背则会报类似空指针一样的问题.

因为 Shell 脚本是解释执行的,也就是从上到下翻译执行.如果一个函数内部调用了这个函数之后定义的某个函数,那么shell解释器就会因为没有加载这个函数而报 “command not found” 。为什么像Java这样的语言就不用考虑函数顺序的问题呢? 因为Java这样的语言在执行之前先编译了一下,在编译阶段,编译器就把函数调用拼装好了,运行的时候只需要去对应的栈找对应函数即可。

例如 test-function.sh

上面的脚本 执行 会打印出

因为执行的时候解析器从上到下开始加载函数 f1、f2、 main 然后执行 main

我们发现 f1 f2 main 都已经加载过了,所以可以顺利执行

这段函数从上往下解析,第一行发现 main 要执行,main不是一个命令,就找main之前有没有加载一个叫main的函数,结果没有于是报错。

上面这个 先加载 f1 函,然后运行f1函数,但是f1 函数在运行的时候会调用 f2函数,可是f2函数并没有定义,于是报错

注意这里报错只是把标准错误输出到控制台,但是后面的命令还是会一次执行,并不会再出错的地方中断。

那我如何像Java一样写起来不用考虑顺序呢?另外我还想解决两个问题。

让脚本 默认用main函数启动

可以指定执行脚本中定义的函数

对于问题1 让脚本 默认用main函数启动

比如Java,我运行一个Java类的时候要就这个java类里面必须有一个main函数,且可以接收 一个数组作为参数。

再来看一下我框架的写法只需要在最后引入一个 文件即可

这段函数的作用是在 函数执行的时候 根据 输入参数执行响应的函数

例如

Sh test-function.sh main 则指定执行main函数

Sh test-function.sh 不加参数默认main函数启动,如果没有main函数则报错,这就解决了main函数启动的问题,启动范式和java xxx类似了。

另外为了解决函数可不在乎定义的先后顺序,我们要做的就是在所有函数都解析过一遍后在执行,所以要把我们的

source ./../Utils/base_end.sh

放到最后。

此外 execute 是用来解决指定函数执行的 ,这个方案同时解决了函数带参问题

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180512G030LF00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券