基本脚本函数
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
来源: https://www.cnblogs.com/jinyuanliu/p/10913821.html