一、函数的两种定义方式

  第一种:函数名(){ ...... }

  第二种:function 函数名{ ...... }

  调用时直接使用 函数名 调用,将函数当作一个“命令”即可。函数内部直接使用 $1、$2 ... $n

二、函数返回值有两种形式

  • return
  • echo

1、使用 return 返回值

  • 利用 return 返回函数的返回值,取值范围为 1~255 的整数
  • 函数使用 return 返回值,通过只是用来供其他地方调用获取状态,因此一般情况只会返回 0 或 1。0表示成功,1表示失败

  例如:判断 nginx 进程是否启动:

#!/bin/bash
# 判断nginx是否启动 function is_run_nginx
{
status=$$
ps -ef | grep ngnix | grep -v grep | grep -v $status &> /dev/null
if [ $? -eq ]; then
# 默认为0
return
else
return
fi
}
# return返回值不能 赋值给某个变量,只能用作后续程序进行判断
# is_run=`is_run_nginx`
is_run_nginx && echo "nginx is running" || echo "nginx is stop"

 2、使用 echo 返回值

  • 使用 echo 可以返回任何字符串结果
  • 通常用来返回数据,比如一个字符串值 或 列表值

  举例:获取系统用户名

#!/bin/bash

#使用echo 返回值,返回系统用户名

function get_users
{
# -d 指定分隔符,-f 指定取第几列
echo `cat /etc/passwd | cut -d : -f `
} user_list=`get_users` index=
for u in $user_list
do
echo "This is $index user: $u"
done

三、Shell 全局变量与局部变量

1、全局变量

  • 不做特殊声明的话,默认都是全局变量
  • Tips:大型脚本慎用全局变量

2、局部变量(只能声明在函数内)

  • 定义变量时,使用 local 关键字
  • 函数内外同时存在同名变量,函数内变量覆盖函数外变量

注意:如果函数没有调用,函数里面的变量是不会生效的。

#!/bin.bash

var1="hello var1"

function test
{
var2="hello var2"
local var3="hello var3"
} # test 没调用,var2,var3都不存在
echo $var1
echo $var2
echo $var3 test echo $var1
echo $var2
# var3 为局部变量,不能打印
echo $var3

打印结果:

hello var1
// test函数没调用,var2 不存在
       // test函数没调用,var2 不存在
hello var1 hello var2
// var3 是局部变量,echo 一个空值

四、建立函数库

 函数库存在的目的就是 将重复代码封装成函数文件。一般函数库不直接执行,而是供脚本进行调用

关于函数库的一些经验:

  • 库文件名的后缀是任意的,一般建议使用 .lib
  • 库文件一般没有可执行选项
  • 库文件无需和脚本在同一级目录,只需在脚本中引用时指定
  • 第一行一般使用 #!/bin/echo , 输出警告信息,避免用户执行。

举个例子:

  定义一个函数库,该函数库实现一下几个函数:1、加法函数 add;2、减法函数 reduce;3、乘法函数 multiple;4、除法函数 devide;打印系统运行情况的函数 sys_load,该函数可以显示内存运行情况。

  函数库如下:

function add
{
echo "`expr $1 + $2`"
} function reduce
{
echo "`expr $1 - $2`"
} function multiple
{
echo "`expr $1 \* $2`"
} function divide
{
echo "`expr $1 / $2`"
} function sys_load
{
echo "Memory Info"
echo
free -m
echo echo "Disk Usage"
echo
df -h
echo
} 

  引用函数库中的函数,当前 脚本 和 lib 在同一级目录。

#!/bin/bash

# 引用函数库 lib/base_function
# 通过点 ". " 引入函数库
. lib/base_function.lib add reduce multiple divide sys_load

 

 

Shell 函数相关的更多相关文章

  1. Linux Shell系列教程之(十五) Shell函数简介

    本文是Linux Shell系列教程的第(十五)篇,更多Linux Shell教程请看:Linux Shell系列教程 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高 ...

  2. 使用shell数据处理数据实例①-------手把手教学版

    引子: 在工作过程中经常要处理各种小数据,同事间会用各种工具方法来处理,比如用java.python.Perl甚至用UE手工处理.但貌似不都方便. 今天举一例子使用shell来处理,来说明shell一 ...

  3. 深入理解计算机系统项目之 Shell Lab

    博客中的文章均为meelo原创,请务必以链接形式注明本文地址 Shell Lab是CMU计算机系统入门课程的一个实验.在这个实验里你需要实现一个shell,shell是用户与计算机的交互界面.普通意义 ...

  4. 测试常用shell语句——数值,数组类型;函数创建

    一.特殊类型的变量 shell下默认的变量类型为字符串类型 1,数值类型 如果进行数值运算,有这么几种方法 方法一: declare -i sum sum=+ echo $sum 方法二: sum=$ ...

  5. 快,学会 shell

    本文分成入门篇和基础篇.基础篇包括变量.字符串处理.数学运算三部分.基础篇包括流控制.函数和函数库三部分.主要是基于例子进行讲解,其中有 4 个复杂一点的脚本,看懂了也就入门了. 我们先来聊一聊 sh ...

  6. Shell替换

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...

  7. Shell特殊变量

    $ 表示当前Shell进程的ID,即pid $echo $$ 运行结果 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数 ...

  8. shell变量

    定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...

  9. 第一个shell脚本

    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...

随机推荐

  1. vuex的学习和理解

    初识Vuex: vuex是 vue官方推荐的一个状态管理器,也是vue专用的一个插件.当我们遇到很多状态改变时,组件之间的通信就会变得复杂,这时候vuex的强大就体现出来了. Vuex 应用的核心就是 ...

  2. 安装卡巴 OFFICE链接 出现这个过程被中断,由于本机的限制

    今天 安装了卡巴后 office 超链接功能不能使用了,一点击超链接,就会发出警报,说”由于本机的限制,此操作已被取消,请与系统管理员联系“ 解决办法:1打开注册表2到这个位置:HKEY_CURREN ...

  3. 雷林鹏分享:jQuery EasyUI 数据网格 - 自定义排序

    jQuery EasyUI 数据网格 - 自定义排序 如果默认的排序行为不满足您的需求,您可以自定义数据网格(datagrid)的排序行为. 最基础的,用户可以在列上定义一个排序函数,函数名是 sor ...

  4. zoj3223

    其实这题不超时完全是因为串长度太小,如果串够长,一次匹配后都要往上跳,复杂度是n^2的. #include <iostream> #include <cstdio> #incl ...

  5. SpringBoot整合Mybatis注解版---update出现org.apache.ibatis.binding.BindingException: Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1, param2]

    SpringBoot整合Mybatis注解版---update时出现的问题 问题描述: 1.sql建表语句 DROP TABLE IF EXISTS `department`; CREATE TABL ...

  6. CodeIgniter框架解析

    转载于:https://www.cnblogs.com/xiaoxiaoqingyi/p/6901654.html 转载仅为以后自己学习. 业余花了点时间看看CodeIgniter框架(简称CI),C ...

  7. MySQL备份脚本-亲试ok

    #!/bin/bash # 以下配置信息请自己修改mysql_user="USER" #MySQL备份用户mysql_password="123456" #My ...

  8. WDA基础十六:ALV的颜色

    这里介绍三种类型的颜色:列的背景色,单元格的背景色,单元格文本的颜色. 1.给ALV结构添加颜色控制字段: 三个字段都是同一类型:WDY_UIE_LIBRARY_ENUM_TYPE COL_BACKG ...

  9. raid卡的结构示意图

    raid卡的结构示意图,取自<大话存储>第124页 ROM:一般用FLash芯片做ROM,存放着初始化RAID卡必须的代码以及实现RAID功能所需的代码; XOR芯片:专门用来做RAID ...

  10. mpvue学习笔记(二)

    六.mpvue入门 http://mpvue.com/ 1.安装 $ vue init mpvue/mpvue-quickstart my-project$ cd my-project$ npm in ...