Shell 函数相关
一、函数的两种定义方式
第一种:函数名(){ ...... }
第二种: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 函数相关的更多相关文章
- Linux Shell系列教程之(十五) Shell函数简介
本文是Linux Shell系列教程的第(十五)篇,更多Linux Shell教程请看:Linux Shell系列教程 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高 ...
- 使用shell数据处理数据实例①-------手把手教学版
引子: 在工作过程中经常要处理各种小数据,同事间会用各种工具方法来处理,比如用java.python.Perl甚至用UE手工处理.但貌似不都方便. 今天举一例子使用shell来处理,来说明shell一 ...
- 深入理解计算机系统项目之 Shell Lab
博客中的文章均为meelo原创,请务必以链接形式注明本文地址 Shell Lab是CMU计算机系统入门课程的一个实验.在这个实验里你需要实现一个shell,shell是用户与计算机的交互界面.普通意义 ...
- 测试常用shell语句——数值,数组类型;函数创建
一.特殊类型的变量 shell下默认的变量类型为字符串类型 1,数值类型 如果进行数值运算,有这么几种方法 方法一: declare -i sum sum=+ echo $sum 方法二: sum=$ ...
- 快,学会 shell
本文分成入门篇和基础篇.基础篇包括变量.字符串处理.数学运算三部分.基础篇包括流控制.函数和函数库三部分.主要是基于例子进行讲解,其中有 4 个复杂一点的脚本,看懂了也就入门了. 我们先来聊一聊 sh ...
- Shell替换
如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...
- Shell特殊变量
$ 表示当前Shell进程的ID,即pid $echo $$ 运行结果 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数 ...
- shell变量
定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...
- 第一个shell脚本
打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...
随机推荐
- vuex的学习和理解
初识Vuex: vuex是 vue官方推荐的一个状态管理器,也是vue专用的一个插件.当我们遇到很多状态改变时,组件之间的通信就会变得复杂,这时候vuex的强大就体现出来了. Vuex 应用的核心就是 ...
- 安装卡巴 OFFICE链接 出现这个过程被中断,由于本机的限制
今天 安装了卡巴后 office 超链接功能不能使用了,一点击超链接,就会发出警报,说”由于本机的限制,此操作已被取消,请与系统管理员联系“ 解决办法:1打开注册表2到这个位置:HKEY_CURREN ...
- 雷林鹏分享:jQuery EasyUI 数据网格 - 自定义排序
jQuery EasyUI 数据网格 - 自定义排序 如果默认的排序行为不满足您的需求,您可以自定义数据网格(datagrid)的排序行为. 最基础的,用户可以在列上定义一个排序函数,函数名是 sor ...
- zoj3223
其实这题不超时完全是因为串长度太小,如果串够长,一次匹配后都要往上跳,复杂度是n^2的. #include <iostream> #include <cstdio> #incl ...
- 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 ...
- CodeIgniter框架解析
转载于:https://www.cnblogs.com/xiaoxiaoqingyi/p/6901654.html 转载仅为以后自己学习. 业余花了点时间看看CodeIgniter框架(简称CI),C ...
- MySQL备份脚本-亲试ok
#!/bin/bash # 以下配置信息请自己修改mysql_user="USER" #MySQL备份用户mysql_password="123456" #My ...
- WDA基础十六:ALV的颜色
这里介绍三种类型的颜色:列的背景色,单元格的背景色,单元格文本的颜色. 1.给ALV结构添加颜色控制字段: 三个字段都是同一类型:WDY_UIE_LIBRARY_ENUM_TYPE COL_BACKG ...
- raid卡的结构示意图
raid卡的结构示意图,取自<大话存储>第124页 ROM:一般用FLash芯片做ROM,存放着初始化RAID卡必须的代码以及实现RAID功能所需的代码; XOR芯片:专门用来做RAID ...
- mpvue学习笔记(二)
六.mpvue入门 http://mpvue.com/ 1.安装 $ vue init mpvue/mpvue-quickstart my-project$ cd my-project$ npm in ...