shell编程之函数
一、函数定义和调用
函数是Shell脚本中自定义的一系列执行命令,一般来说函数应该设置有返回值(正确返回0,错误返回非0)。对于错误返回,可以定义其他非0正值来细化错误。使用函数最大的好处是可避免出现大量重复代码,同时增强了脚本的可读性:如果你在某个Shell脚本中看到checkFileExist的这样的代码(实际是函数调用),一定不难猜出代码的作用。
[root@Cfhost-170820-UCNK ~]# cat sayHello.sh
#!/bin/bash
function sayHello(){ #关键字function 可以省略
echo "Hello"
}
echo "Call function sayHello" #提示函数调用
sayHello #函数调用
[root@Cfhost-170820-UCNK ~]# sh sayHello.sh
Call function sayHello
Hello
[root@Cfhost-170820-UCNK ~]# cat countLine.sh
#!/bin/bash
FILE=/etc/passwd
function countLine(){
local i=0
while read line
do
let ++i
done < $FILE
echo "$FILE have $i line"
}
echo "Call functino countLine"
countLine
[root@Cfhost-170820-UCNK ~]# sh countLine.sh
Call functino countLine
/etc/passwd have 25 line
二、函数的返回值
函数的返回值又叫函数的退出状态,实际上是一种通信方式。Shell中的函数可以使用"返回值"的方式来给调用者反馈信息(使用return关键字),不要忘了获取上一个命令返回值的方式是使用$? 这样获取函数返回值的主要方式。
[root@Cfhost-170820-UCNK ~]# cat checkFileExist.sh
#!/bin/bash
FILE=/etc/notExistFile #定义一个不存在的文件
function checkFileExist(){ #定义checkFileExist函数
if [ -f $FILE ];then
return 0
else
return 1
fi
}
checkFileExist #调用函数
if [ $? -eq 0 ];then
echo "$FILE exist"
else
echo "$FILE not exist"
fi
[root@Cfhost-170820-UCNK ~]# sh checkFileExist.sh
/etc/notExistFile not exist
三、带参数的函数
checkFileExist.sh脚本中定义了checkFileExist函数,但是可以看到这个脚本实际上写死了FILE变量,这会造成想要判断不同的文件是否存在时,需要修改脚本中的FILE变量 -也就是要对代码本身的内容进行修改,这也是典型的代码和数据没有分开而导致的问题。事实上,可以通过定义带参数的函数解决这个问题。
[root@Cfhost-170820-UCNK ~]# cat checkFileExist_v2.sh
#!/bin/bash
function checkFileExist(){
if [ -f $1 ];then
return 0
else
return 1
fi
}
echo "Call function checkFileExist"
checkFileExist $1
if [ $? -eq 0 ];then
echo "$1 exist"
else
echo "$1 not exist"
fi
执行结果:
[root@Cfhost-170820-UCNK ~]# sh checkFileExist_v2.sh /etc/not
Call function checkFileExist
/etc/not not exist
四、指定位置参数值
除了在脚本运行时给脚本传入的位置参数外,还可以使用内置命令set命令给脚本指定位置参数的值(又叫重置)。一旦使用set设置了传入参数的值,脚本将忽略运行时传入的位置参数(实际上被set命令重置了位置参数的值)
#!/bin/bash
set 1 2 3 4 5 6
COUNT=1
for i in $@
do
echo "Here \$ $COUNT is $i"
let "COUNT++"
done
执行结果如下:
[root@Cfhost-170820-UCNK ~]# sh set01.sh a b c d e f
Here $ 1 is 1
Here $ 2 is 2
Here $ 3 is 3
Here $ 4 is 4
Here $ 5 is 5
Here $ 6 is 6
五、移动位置参数
在shell中使用shift命令移动位置参数,shift命令可让位置参数左边移动一位
[root@Cfhost-170820-UCNK ~]# cat shift_03.sh
#!/bin/bash
until [ $# -eq 0 ]
do
echo "Now \$1 is: $1, total parameter is:$#"
shift
done
执行结果:
[root@Cfhost-170820-UCNK ~]# sh shift_03.sh a b c
Now $1 is: a, total parameter is:3
Now $1 is: b, total parameter is:2
Now $1 is: c, total parameter is:1
利用shift计算脚本中所有参数的和:
[root@Cfhost-170820-UCNK ~]# cat shift_04.sh
#!/bin/bash
TOTAL=0
until [ $# -eq 0 ]
do
let "TOTAL=TOTAL+$1"
shift
done
echo $TOTAL
执行结果:
[root@Cfhost-170820-UCNK ~]# sh shift_04.sh 10 20 30
60
shell编程之函数的更多相关文章
- Shell编程—创建函数
1基本的脚本函数 函数是一个脚本代码块,你可以为其命名并在代码中任何位置重用.要在脚本中使用该代码块时,只要使用所起的函数名就行了. 1.1创建函数 有两种格式可以用来在bash shell脚本中创建 ...
- shell编程 之 函数
1 函数基本格式 个人认为,编程中的函数基本上有3种,第一种是糖葫芦函数,一根棒棒串起来,执行一次就是走个过场,吃完了糖葫芦就没别的事了,第一种基本就是这样的: 它没有参数,没有返回值. demoFu ...
- Linux - 简明Shell编程08 - 函数(Function)
脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 #!/bin/bash function Check( ...
- shell 编程之函数
shell 函数的定义和普通的c语言函数定义差不多 function(){ } shell 函数的返回值,可以显示的return 语句,如果没有return 那么就会把最后一条语句的执行结果作为返回 ...
- Shell 编程(函数)
声明函数 demoFun(){ echo "这是我的第一个 shell 函数!" } 函数名(){ ...函数体 } 在Shell中,调用函数时可以向其传递参数.在函数体内部,通过 ...
- Shell编程常用函数
1.打印提示消息函数,不同级别消息使用不同的颜色显示.其中错误信息提示为红色字体. # -------------------------------------------------------- ...
- shell编程:函数的返回值
函数的返回值两种形式 return 0-255 0表示成功,1-255表示失败-------通常用于判断 echo 返回一个字符串------------通常用于返回一个执行的结果 return.sh ...
- 《Linux.Shell编程从入门到精通》读书笔记
第一章 第一个Shell程序 以 #!解析器名称 开头,表示选择哪个解释器解释shell脚本 source命令 export命令 env命令 unset命令 第二章 shell编程基础 函数传递 标准 ...
- shell编程中的 三种结构: 条件if/选择结构case/循环for/while/until等结构 和 函数的用法
shell 函数的使用 (md中, 列表本身是有格式的, 他要产生缩进, 其次,列表项和列表项之间, 可以留有一个空行, 是合法的, 允许的) shell函数,就是 就相当于一个命令来看待和处理的, ...
随机推荐
- 以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组
学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简 ...
- mysql之Navicat工具、pymysql模块
1. IDE工具介绍(Navicat) 为了方便测试,使用IDE工具,就是Navicat,这个工具本质上就是一个socket客户端,可视化的连接mysql服务端的一个工具,并且是图形界面版的.它和直接 ...
- 前端面试题整理——javaScript部分
(1)typeof 和 instanceof 1.typeof 对于基本数据类型(boolean.null.undefined.number.string.symbol)来说,除了 null 都可以显 ...
- numpy库的常用方法
np.abs() 计算数组各元素的绝对值1 a= [0,1,2,3,4,-5,9,-3,12,-4] np.abs(a)out: array([ 0, 1, 2, 3, 4, 5, 9, 3, 12, ...
- JMeter 配置元件之计数器Counter
配置元件之计数器Counter by:授客 QQ:1033553122 测试环境 apache-jmeter-2.13 1. 计数器简介 允许用户创建一个在线程组范围之内都可以被引用的计数器. ...
- 记录定时任务的一个错误:crontab 中使用"%"的问题
最近工作需要,需要定时执行命令文件,并且把执行的日志重定向输出到以日期命名的文件中,命令如下: /bin/bash /data/shell/merge.sh &>> /data/s ...
- Django的认证系统—auth模块
Django的认证系统 auth模块的知识点总结: 1. 创建超级用户 python manage.py createsuperuser from django.contrib import auth ...
- 11-OpenLDAP主从同步
OpenLDAP主从同步 阅读视图 部署环境 OpenLDAP服务器初始化 配置主服务器同步策略 配置从服务器 OpenLDAP主从同步验证 故障诊断 1. 部署环境 本文以两台服务器为蓝本演示其同步 ...
- forfiles命令详解
目录复制命令: xcopy //server/bak/*.* d:/serverbak /s /e /v /c / d /y /h at 05:30 shutdown ...
- js判断IE浏览器及版本
function isIE(_version){ _version = _version || ''; var b = document.createElement('b'); b.innerHTML ...