运维Shell脚本小试牛刀(七):在函数文脚本件中调用另外一个脚本文件中函数

2023-11-03


运维Shell脚本小试牛刀(一)

运维Shell脚本小试牛刀(二)

运维Shell脚本小试牛刀(三)::$(cd $(dirname $0); pwd)命令详解

运维Shell脚本小试牛刀(四): 多层嵌套if...elif...elif....else fi_蜗牛杨哥的博客-CSDN博客

Cenos7安装小火车程序动画

运维Shell脚本小试牛刀(五):until循环

运维Shell脚本小试牛刀(六): Shell中的函数认知

运维Shell脚本小试牛刀(八): case模式忽略命令行参数大小写

运维Shell脚本小试牛刀(七):从函数文件中调用另外一个脚本文件中函数


简介: 从函数文件中调用函数

你可以把所有的函数存储在一个脚本文件

你可以把所有的函数加载到当前脚本文件或者时命令行

加载函数文件的所有函数的语法如下:

. /path/to/your/functions.sh


一: 编写函数文件

[root@www dicfor]# cat myfunctions.sh
#==================================================================================================================
#
#
#                           FILE:  myfunctions.sh
#                           USAGE: ./myfunctions.sh
#    DESCRIPTION:   函数定义:从函数文件中调用函数,可以把所有的函数存储在一个文件中,然后把所有的函数加载到当前脚本或是命令行
#        OPTIONS: -------
#        REQUIREMENTS: ---------

#        BUGS: ------
#        NOTES: -------- 
#        AUTHOR: ---------YangGe (TOM) ,YangGe.freedom@icloud.com
#    ORGANIZATION:
#        CREATED: 2023-8-24 09:11:20    
#        REVISION: --------
#
#
#
#
#
#====================================================================================================================
# 加载函数文件中的所有函数的语法如下: . /path/to/your/functions.sh

# 定义变量
declare -r TRUE=0
declare -r FALSE=0
declare -r PASSWD_FILE=/etc/passwd

###################################################################################################################
#
#   用途: 将字符串转换为小写
#     参数
#       $1 -> 要转换为小写的字符串
#
#
#
#
####################################################################################################################
function to_lower() {
  # 定义一个本地变量str
  local str="$@"
  # 定义本地变量output
  local output
  # 将变量str的值转换为小写符赋值给变量output
  output=$(tr ' [A-Z] ' ' [a-z] '<<<"${str}")
  echo $output

}

###################################################################################################################
#
#   用途: 如果脚本root用户执行则返回true
#     参数 无
#   返回值: True或者Flase
#
#
#
#
####################################################################################################################

function is_root()
{
  # 如果运行此脚本的账号的uid等于0,则返回0,否则返回1
  [ $(id -u) -eq 0 ] && return $TRUE || return $FALSE


}
###################################################################################################################
#
#   用途: 如果用户名存在于文件/etc/passwd 中则返回true
#     参数
#       $1 (用户名) -> 要在文件/etc/passwd 中检查的用户名
#       返回值: True 或者 False
#
#
#
#
####################################################################################################################
function is_user_exits()
{
   # 定义本地变量u
   local u="$1"
   # 如果文件/etc/passwd中存在以变量$u的值为开头的行,则返回0,否则返回1
   grep -q "^${u}" $PASSWD_FILE && return $TRUE || return $FALSE

}
 

二: 加载函数文件到当前shell环境


[root@www dicfor]# pwd
/usr/local/example/dicfor
[root@www dicfor]# . /usr/local/example/dicfor/myfunctions.sh
-bash: declare: TRUE: 只读变量
-bash: declare: FALSE: 只读变量
-bash: declare: PASSWD_FILE: 只读变量
 

三: 编写加载myfunctions.sh函数文件的脚本文件 


[root@www dicfor]# cat myfunctionsdemo.sh 
#==================================================================================================================
#
#
#                           FILE:  functionsdemo.sh
#                           USAGE: ./functionsdemo.sh
#    DESCRIPTION:   函数定义,在该文件中加载一个函数文件myfunctions.sh到该脚本文件中
#        OPTIONS: -------
#        REQUIREMENTS: ---------

#        BUGS: ------
#        NOTES: -------- 
#        AUTHOR: ---------YangGe (TOM) ,YangGe.freedom@icloud.com
#    ORGANIZATION:
#        CREATED: 2023-8-24 09:11:20    
#        REVISION: --------
#
#
#
#
#
#====================================================================================================================
# 加载函数文件myfunctions.sh
# 这里的路径需要根据你的实际环境作出跳转
. /usr/local/example/dicfor/myfunctions.sh

# 定义本地变量
# var1时没有被myfunctions.sh使用的
var1="The Mahabharata is the longest and,arguably,one of the greatest epicpoems is any language.."

# 调用函数is root , 指定成功或失败,会分别打印不同的信息
is_root && echo "You are logged in as root." || echo "You are not logged in as root"

# 调用函数is_use_exits
is_user_exits "mysql" && echo "Account found." || echo "Account not found."

# 打印变量的值var1
echo -e "*** Orignal quote: \n${var1}" 

# 调用函数to_lower()
# 将#var1 作为参数传递给to_lower()

# 在echo 内使用的命令替换
echo -e "*** Lowercase version: \n$(to_lower ${var1})"
 

四: 执行该脚本|看看该脚本是否已调用引入的脚本函数


[root@www dicfor]# ./myfunctionsdemo.sh 
You are logged in as root.
Account found.
*** Orignal quote: 
The Mahabharata is the longest and,arguably,one of the greatest epicpoems is any language..
*** Lowercase version: 
the mahabharata is the longest and,arguably,one of the greatest epicpoems is any language..

五: 函数递归调用 

[root@www functiondic]# cat functionnestedCalled.sh 
#==================================================================================================================
#
#
#                           FILE:  functionNestedCalled.sh
#                           USAGE: ./functionNestedCalled.sh
#    DESCRIPTION:  Shell中函数递归调用
#        OPTIONS: -------
#        REQUIREMENTS: ---------

#        BUGS: ------
#        NOTES: -------- 
#        AUTHOR: ---------YangGe (TOM) ,YangGe.freedom@icloud.com
#    ORGANIZATION:
#        CREATED: 2023-8-24 09:11:20    
#        REVISION: --------
#
#
#
#
#
#====================================================================================================================
# 定义函数factorial()--计算给定命令行参数的阶层
function factorial {

  # 定义本地变量i
  local i=$1
  # 定义本地变量f
  local f
  # 声明变量为整数
  declare -i i
  # 声明变量f为整数
  declare -i f

  # factorial 函数被调用,只到调用$f的值<-2
  # 开始递归
 [ $1 -le 2 ] && echo $i || { f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo ${f}; } 

}

# 显示函数用法
[ $# -eq 0 ] &&  { echo "Usage: $0 number"; exit 1; }

# 调用函数factorial
factorial $1
 


执行脚本:

[root@www functiondic]# ./functionnestedCalled.sh 
Usage: ./functionnestedCalled.sh number
[root@www functiondic]# ./functionnestedCalled.sh 2
2
[root@www functiondic]# ./functionnestedCalled.sh 4
24
[root@www functiondic]# ./functionnestedCalled.sh 24
-7835185981329244160
[root@www functiondic]# ./functionnestedCalled.sh 10
3628800
 

六:  Shell脚本函数后台执行


[root@www functiondic]# cat saemoncalledFunction.sh 
#==================================================================================================================
#
#
#                           FILE:  saemoncalledFunction.sh
#                           USAGE: ./saemoncalledFunction.sh
#    DESCRIPTION:  Shell 中函数放在后台执行
#        OPTIONS: -------
#        REQUIREMENTS: ---------

#        BUGS: ------
#        NOTES: -------- 
#        AUTHOR: ---------YangGe (TOM) ,YangGe.freedom@icloud.com
#    ORGANIZATION:
#        CREATED: 2023-8-24 09:11:20    
#        REVISION: --------
#
#
#
#
#
#====================================================================================================================
# 定义函数progress,显示进度条
progress(){
 echo -n "$0: Please wait.............."
  # 执行无限while循环
  while true
  do
    echo -n "."
    # 休眠5秒
    sleep 5
  done

}

# 定义函数dobackup
dobackup(){
 # 运行备份命令
 tar -zcvf /dev/st0 /home >/dev/null 2>&1

}

# 将函数放在后台运行
progress &

# 保存函数progress()运行的进程号
# 需要使用PID来结束此函数
MYSELF=$!

# 开始备份
# 转移控制到函数dobackup
dobackup

# 杀死进程
kill $MYSELF > /dev/null 2>&1
echo -n ".....done."
echo
 


脚本执行效果:


[root@www functiondic]# ./saemoncalledFunction.sh 
./saemoncalledFunction.sh: Please wait.....................done.
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运维Shell脚本小试牛刀(七):在函数文脚本件中调用另外一个脚本文件中函数 的相关文章

  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • 在 Linux 上以编程方式设置 DNS 名称服务器

    我希望能够通过我的 C C 程序为 Linux 上的 DNS 名称服务器添加 IP 地址 我在一个带有只读 etc resolv conf 的嵌入式平台上 这意味着我不能简单地将 nameserver xxx xxx xxx xxx 行添加
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 配置tomat的server.xml文件并自动生成mod_jk.conf

    我在用apache 2 2 15 and tomcat6 6 0 24 on CentOS 6 4并希望使用 tomcat 服务器的功能 通过添加以下内容自动生成 mod jk conf 文件
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • linux下如何从文本文件中获取值

    我有一些文本格式的文件 xxx conf 我在这个文件中有一些文本 disablelog 1 当我使用 grep r disablelog oscam conf 输出是 disablelog 1 但我只需要值1 请问你有什么想法吗 一种方法
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 在 scp 的简单函数包装中使用波形符 ~ 时出现问题

    我想放置一个简单的bash功能在我的 bashrc围绕着scp通过接受 源 参数和 目标 参数来命令 到目前为止已经尝试过 function send eval scp 1 user annoyingly long server name
  • 从核心转储中获取堆栈跟踪

    如何从核心转储文件中获取堆栈跟踪 该文件大约 14 mb 是在我的应用程序退出并显示 分段错误 后生成的 我使用的是红帽 5 5 gdb usr bin myapp binary corefile 然后 使用以下之一 gdb bt gdb

随机推荐

  • 【JMeter】RSA加密传参处理方法

    问题 登录请求参数中输入了正确的账号密码 响应结果报错 用户名或密码错误 原因分析 密码需要以RSA加密的方式传参 不能明文 解决方法 在该登录接口下新增一个 B e a n
  • UDP的抓包和网络协议

    背景 一直都在wireshar抓包 但是经常看的都是应用的报文 没有关注到udp的本身传输协议 所以花了一点时间查看了一下UDP的传输协议是什么样的 报文 这个是之前抓包的udp 的协议报文然后对应协议的字段进行协议 目前查看的话还是比较清
  • [编程题] 等差数列

    如果一个数列S满足对于所有的合法的i 都有S i 1 S i d 这里的d也可以是负数和零 我们就称数列S为等差数列 小易现在有一个长度为n的数列x 小易想把x变为一个等差数列 小易允许在数列上做交换任意两个位置的数值的操作 并且交换操作允
  • linux下使用socat

    其实网络协议比较简单 一般都是一个固定的套路 传 输 包 传 输 的 数
  • MES系统各部门评估建议

    生产部 如果期望通过项目推动来解决库存和交期的问题 需要首先针对我们最大的短板和痛点 供应商交期和品质 有针对性的改善 否则系统上了后也会因短板没有解决 无法实现最终目的 如果是为了解决目前制造部各单元计划协同性及准确性问题 以及针对急单插
  • Linux网络文件共享服务(一)存储类型和文件传输协议FTP

    成功不易 加倍努力 网络文件共享服务 本章总目录 1 存储类型 1 1 DAS存储 1 2 NAS存储 1 3 SAN存储 1 4 三种存储比较 2 文件传输协议 FTP 2 1 FTP工作原理介绍 2 2 常见 FTP 相关软件 2 3
  • 谈谈To B业务的难点

    最近有个说法 中国互联网的新增长点是 To B业务 而一个经常被提及的事实是 中美互联网巨头对比 在To C业务上的收益和市值近乎并驾齐驱 虽有差距 但至少是可以相提并论的 而在To B业务上 美国巨头的市场规模 比起中国的同类公司 高两个
  • STM32CubeMX之emWin移植

    前面两章介绍了SDRAM和LTDC的使用 本篇文章将介绍emWin移植到STM32 硬件环境 STM32F429IGT6 软件环境 STM32CubeMX v5 5 0 HAL库版本 STM32CubeF4 Firmware Package
  • 什么叫泛型?有什么作用?

    作者 Java3y 链接 https www zhihu com question 272185241 answer 366129174 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 一 什么是泛型 Jav
  • MySQL的B+树索引和hash索引的区别

    简述一下索引 索引是数据库表中一列或多列的值进行排序的一种数据结构 索引分为聚集索引和非聚集索引 聚集索引查询类似书的目录 快速定位查找的数据 非聚集索引查询一般需要再次回表查询一次 如果不使用索引就会进行全表扫描 还有可以进行多字段组成联
  • svn历史版本操作说明

    svn历史操作简写说明 操作的字母缩写为R 一般我们常见的操作为 A D M R A add 新增 C conflict 冲突 D delete 删除 M modify 本地已经修改 G modify and merGed 本地文件修改并且
  • centos安装gcc时出现问题:Delta RPMs disabled because /usr/bin/applydeltarpm not installed.

    解决办法 此问题安装Deltarpm包 增量 RPM 套件 即可解决 当然您也可以先使用一下命令 查看是哪个包提供applydeltarpm yum provides applydeltarpm yum install deltarpm y
  • 我见过的最糟糕代码

    作者 Mehdi Zed 在本文 将向读者展示一些作者见过的一些最糟糕的代码 除非你希望被同事和用户讨厌 否则这些 魔鬼 永远都不应该被放到人间 我们会发现 通过一些好的实践 其实很容易避免它们 01 魔鬼代码 需要改进的代码与所谓的 魔鬼
  • 2023年Node.js全网详细下载安装的最新教程

    文章目录 1 文章引言 2 下载安装 3 检查是否安装成功 4 补充说明 1 文章引言 今天准备写下载和安装vue js的博文 但安装vue js的前提是要安装node和npm 我们在安装node js时 会自动安装的npm包管理器 接下来
  • [深度学习]Part2 数据清洗和特征工程Ch06——【DeepBlue学习笔记】

    本文仅供学习使用 数据清洗和特征工程Ch06 1 特征工程 1 1 特征工程介绍 1 2 特征预处理 1 2 1 数据清洗 1 2 1 1 数据清洗 预处理 1 2 1 2 数据清洗 格式内容错误数据清洗 1 2 1 3 数据清洗 逻辑错误
  • linux kernel development 3rd

    很早就听说这本书了 但是一直未看 现在稍微看看 第3章 1 vfork与fork不一样 但是也没多大作用 不看也罢 2 进程pcb task struct保存在process kernel栈的底端 而而thread info在栈顶端 不知具
  • C语言.表白神器.爱你之心之闪耀

    前言 爱你之心之闪耀 这个名字比较沙雕哈哈哈 爱你之心之闪耀 前言 爱心函数的选取 爱心函数1 爱心函数2 简单爱心 粒子发射原理 爱心结构 一些宏 初始化 init 创建若干爱心并初始化 setHeart 展示爱心 showHeart 爱
  • Vue3的使用

    1 安装命令步骤 vue create 命令 接下来我们创建 runoob vue3 app 项目 vue create runoob vue3 app 执行以上命令会出现安装选项界面 Vue CLI v4 4 6 Please pick
  • 解决升级JDK后:找不到sun.misc.Unsafe的类文件

    原因 JDK9以后已经将sun misc Unsafe弃用 同时改进了lib文件的存储方式 将sun misc Unsafe全部存储在了jdk unsupported里面 解决 手动添加弃用的类文件 在编译时 携带参数 add module
  • 运维Shell脚本小试牛刀(七):在函数文脚本件中调用另外一个脚本文件中函数

    运维Shell脚本小试牛刀 一 运维Shell脚本小试牛刀 二 运维Shell脚本小试牛刀 三 cd dirname 0 pwd 命令详解 运维Shell脚本小试牛刀 四 多层嵌套if elif elif else fi 蜗牛杨哥的博客 C