shell高级-----创建函数

摘要:
基本脚本函数1.在bash shell脚本中创建函数有两种格式。命令是组成函数的一个或多个bash shell命令。当调用此函数时,bashshell将按照命令在函数中出现的顺序执行命令,就像在普通脚本中一样。此格式的命名规则与之前定义的shell脚本函数/bin/bashfunctionfunc1{localtemp=$[$value+5]value=$[$stemp+1]}temp=2value=3func1echo-n“tempis:”echo$tempecho-n”valueis:“echo$value[root@node1ljy]#shceshi。Shtempis:2valueis:9函数递归函数可以调用自己以获得结果/bin/bashfunctionfunc1{如果[$1-eq1]thenchonelselocaltemp=$[$1-1]localresult=$echo$[$result*$1]fi}read-p“entervalue:”valueresult=$echo“thefactorial0f$valueis:$result”[root@node1ljy]#shceshi。Shell间隔:5thefactorial0f5是:120创建库bash Shell允许您创建函数库文件,然后在多个脚本中引用它。

基本脚本函数

1、创建函数

有两种格式可以用来在bash shell脚本中创建函数。
第一种采用关键字function。后跟分配给该代码的函数名。

    function name {
     commands
    }

name属性定义了赋予函数唯一的名称。脚本中定义的每个函数都必须有一个唯一的名称。
commands是构成函数的一条或多条bash shell命令。在调用该函数时,bash shell会按命令在函数中出现的顺序依次执行,就像在普通脚本中一样。

在bash shell脚本中定义函数的第二种格式更接近于其他编程语言中定义函数的方式。

    name(){
    conmmands
    }

函数名后的空括号表明正在定义的是一个函数。这种格式的命名规则和之前定义shell脚本函数的格式一样。

2、使用函数

要在脚本中使用函数,只需要向其他shell命令一样,在行中指定函数名就行。

[root@node1 ljy]# more ceshi.sh 
#!/bin/bash
function func1 {
   echo "hello everyone!"
}
count=1
while [ $count -le 5 ]
do
 func1
 count=$[ $count + 1 ]
done
[root@node1 ljy]# sh ceshi.sh 
hello everyone!
hello everyone!
hello everyone!
hello everyone!
hello everyone!

返回值

有3种不同的方法来为函数生成退出状态码。

1、默认退出状态码

默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码。

如果之前命令有失败,但是最后一条命令是成功的,该函数的退出状态码也是0,所以使用默认退出状态码是很危险的。

2、使用return命令

return命令允许指定一个整数值来定义函数的退出状态码。

[root@node1 ljy]# more ceshi.sh 
#!/bin/bash
function db1 {
   read -p "enter your value:" value
   echo "doubling the value"
   return $[ $value * 2 ]
}
db1
echo "the new value is $?"
[root@node1 ljy]# sh ceshi.sh 
enter your value:3
doubling the value
the new value is 6

如果使用这种方式来获取返回码,需要注意

(1)函数一结束就取返回值。

(2)退出状态码必须是0~255

3、使用函数输出

可以将函数的结果输出保存在变量中。

[root@node1 ljy]# more ceshi.sh 
#!/bin/bash
function db1 {
   read -p "enter your value:" value
   echo $[ $value * 2 ]
}
result=$(db1)
echo "the new value is $result"
[root@node1 ljy]# sh ceshi.sh 
enter your value:2
the new value is 4

在函数中使用变量

像函数传递参数

函数可以使用标准的参数环境变量来表示命令行上传给函数的参数。$#特殊变量表示传递给函数的参数个数。

在脚本中指定函数时,必须将函数和参数放在同一行:funcl $valu1 10

[root@node1 ljy]# more ceshi.sh 
#!/bin/bash
function addem {
   if [ $# -eq 0 ] || [ $# -gt 2 ]
   then 
      echo "-1"
   elif [ $# -eq 1 ]
   then
      echo $[ $1 + $1 ]
   else
      echo $[ $1 + $2 ]
   fi
}
echo -n "adding 10 and 5:  "
value=$(addem 10 5)
echo $value
[root@node1 ljy]# sh ceshi.sh 
adding 10 and 5:  15

也可以这么玩

[root@node1 ljy]# more ceshi.sh 
#!/bin/bash
function addem {
   if [ $# -eq 0 ] || [ $# -gt 2 ]
   then 
      echo "-1"
   elif [ $# -eq 1 ]
   then
      echo $[ $1 + $1 ]
   else
      echo $[ $1 + $2 ]
   fi
}
echo -n "the result is:  "
value=$(addem $1 $2)
echo $value
[root@node1 ljy]# sh ceshi.sh 1 2
the result is:  3

在函数中处理变量

函数使用两种类型的变量,全局变量和局部变量

1、全局变量

默认情况下,你在脚本中定义的任何变量都是全局变量。

[root@node1 ljy]# more ceshi.sh 
#!/bin/bash
function func1 {
   temp=$[ $value + 5 ]
   value=$[ $temp + 1 ]

}
temp=2
value=3

func1

echo -n "temp is :  "
echo $temp
echo -n "value is : "
echo $value
[root@node1 ljy]# sh ceshi.sh 
temp is :  8
value is : 9

temp的数据就受到了影响。

2、局部变量

local 关键字保证了变量只局限在该函数中。

[root@node1 ljy]# more ceshi.sh 
#!/bin/bash
function func1 {
   local temp=$[ $value + 5 ]
   value=$[ $temp + 1 ]

}
temp=2
value=3

func1

echo -n "temp is :  "
echo $temp
echo -n "value is : "
echo $value
[root@node1 ljy]# sh ceshi.sh 
temp is :  2
value is : 9

函数递归

函数可以调用自己来得到结果。

[root@node1 ljy]# more ceshi.sh 
#!/bin/bash
function func1 {
   if [ $1 -eq 1  ]
   then
      echo 1
   else
      local temp=$[ $1 - 1 ]
      local result=$(func1 $temp)
      echo $[ $result * $1 ] 
   fi
}
read -p "enter value: " value
result=$(func1 $value)
echo "the factorial 0f $value is : $result"
[root@node1 ljy]# sh ceshi.sh 
enter value: 5
the factorial 0f 5 is : 120

创建库

bash shell允许创建函数库文件,然后在多个脚本中引用该库文件。

1.创建一个包含脚本中所需函数的公用库文件

2.在用到这些函数的脚本文件中包含库文件名。

[root@node1 ljy]# more myfuncs 
function addem {
   echo $[ $1 + $2 ]
}
[root@node1 ljy]# more ceshi.sh 
#!/bin/bash
. ./myfuncs
result=$(addem 1 2)
echo "result is $result"
[root@node1 ljy]# sh ceshi.sh 
result is 3

使用函数库的关键在于source命令。

source命令有个快捷的别名,叫做点操作符。

. ./name

在命令行上使用函数

在命令行上创建函数

有两种方法:

一、采用单行方式定义函数

[root@node1 ljy]# function func1 { echo $[ $1 + $2 ]; }
[root@node1 ljy]# func1 1 2
3

退出当前终端失效。

二、采用多行方式定义函数

[root@node1 ~]# function func1 {
> echo $[ $1 + $2 ]
> }
[root@node1 ~]# func1 1 3
4

在函数的尾部使用花括号,shell就会知道你完成了函数的定义。

在.bashrc文件中定义函数

为了防止每次退出shell后函数失效,可以将函数写在.bashrc文件。bash shell在每次启动时都会在主目录下查找这个文件。

1.直接定义函数

把你的函数直接写在文件末尾

[root@node1 ~]# more .bashrc 
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
#a test function
function func1 {
   echo $[ $1 + $2 ]
}
[root@node1 ~]# func1 2 3
5

2.读取函数文件

在shell脚本中可以用source命令将库文件的函数添加到你的.bashrc文件中

[root@node1 ~]# more .bashrc 
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
#a test function
. /ljy/myfuncs
[root@node1 ~]# more /ljy/myfuncs 
function addem {
   echo $[ $1 + $2 ]
}
[root@node1 ~]# addem 1 3
4

免责声明:文章转载自《shell高级-----创建函数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Firefox+Burpsuite抓包配置(可抓取https)mac安装java环境下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mongodb 安装

a.安装   本人下载的是windows版本的3.2.1mongo,路径为https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.2.1-signed.msi   或者直接去官网也可以http://www.mongodb.org/downloads   不过需要注意的是mo...

运维与自动化系列④自动化部署基础与git

运维与自动化系列④自动化部署基础与git 自动化部署基础与git 一:上一篇的代码是保存在本地,但是在生产环境当中是由版本控制进行代码管理,以便于发布代码和回滚,一般是使用gitlib比较多,另外还有用svn的公司,趋势是git为主,因此本文以git为使用对象 1.1:在git服务器新建一个web组和项目web-demo: 准备web页面并提交至git服务...

shell (7)if 表达式

文件表达式if [ -f file ] 如果文件存在if [ -d … ] 如果目录存在if [ -s file ] 如果文件存在且非空if [ -r file ] 如果文件存在且可读if [ -w file ] 如果文件存在且可写if [ -x file ] 如果文件存在且可执行 整数变量表达式 -ne:(notequal)不相等 -gt:(great...

假设检验的Python实现

结合假设检验的理论知识,本文使用Python对实际数据进行假设检验。 导入测试数据 从线上下载测试数据文件,数据链接:https://pan.baidu.com/s/1t4SKF6U2yyjT365FaE692A* 数据字段说明: gender:性别,1为男性,2为女性 Temperature:体温 HeartRate:心率 下载后,使用pandas的re...

Prism框架研究(一)

从今天起开始写一个Prism框架的学习博客,今天是第一篇,所以从最基本的一些概念开始学习这个基于MVVM的框架的学习,首先看一下Prism代表什么,这里引用一下比较官方的英文解释来看一下:Prism was the code name for the guidance formally known as the Composite Application...

Money工具 压力稳定性测试

1.Money工具压力稳定性测试2.monkey是Android 平台自带的测试小工具3.原理:模拟用户的操作,点击,滑动,发送按键操作4.环境安装/部署-之前APP 自动化配置已经搞定5.链接Android设备1)模拟器 夜神cmd->adb connect 127.0.0.1:62001adb devices127.0.0.1 IP addre...