函数
函数(function),可以理解为:函数是实现一定功能的代码块。
函数也是重用代码(reuse code)的很好方式。
可以把函数想象成shell脚本里的小脚本。
定义(创建)shell函数有两种方式:
函数名 () {
函数体
}
或者
function 函数名 {
函数体
}
- 这两种方式都可以。第一种函数名后边的括号里不加任何参数。
- 函数的完整定义必须置于函数的调用之前。
例:
#!/bin/bash
print_sth () {
echo "hello,am a function"
}
print_sth
print_sth
传递参数
在shell函数中,传递参数很想给shell脚本传递命令行参数。把参数直接置于函数名字后面。
例:
#!/bin/bash
print_something () {
echo Hello $1
}
print_something Matthew
print_something Mark
print_something Luke
print_something John
返回值
大多数编程语言都有函数返回值的概念,可以让函数回传一些数据。
shell的函数无法做到,但是shell的函数可以返回一个状态,有点类似一个程序或命令退出时会有一个退出状态,表明是否成功。
shell函数要返回状态,也用return这个关键字。
例:
#!/bin/bash
print_sth () {
echo hello $1
return 1
}
print_sth lulu
print_sth nike
echo Return value of previous function is $?
第四行,返回的状态不一定是被硬编码(如上例中的1),也可以是一个变量。
$?
包含前一次被运行的命令或函数的返回状态。
例:
返回一个数值(一个计算的值)。
#!/bin/bash
lines_in_file () {
cat $1 | wc -l
}
line_num=$(lines_in_file $1)
echo the file $1 has $line_num lines
变量作用范围
变量的作用范围,意味着一个shell脚本的哪些部分可以访问这个变量。
默认情况,一个变量是全局的(global),在脚本的任何地方都可以访问它。
也可以创建局部(local)变量,当我们在函数中创建局部变量时,这个变量就只能在这个函数中被访问。
要定义一个局部变量,只要在第一次给这个变量赋值时在变量名前加上关键字 local 即可。
定义一个局部变量有一个好处,就是可以防止被脚本当其他地方的代码意外改变数值。
例:
#!/bin/bash
local_global () {
local var1='local 1'
echo Inside function: var1 is $var1 : var2 is $var2
var1='changed again' # 这里的 var1 是函数中定义的局部变量
var2='2 changed again' # 这里的 var2 是函数外定义的全局变量
}
var1='global 1'
var2='global 2'
echo Before function call: var1 is $var1 : var2 is $var2
local_global
echo After function call: var1 is $var1 : var2 is $var2
在函数中,尽量用局部变量,实在不行用全局变量。
重载命令
可以用函数来实现命令的重载,就是说把函数的名字取成与我们通常在命令行用的命令相同的名字。
例:
#!/bin/bash
ls () {
command ls -lh
}
ls
command
关键字,意思是命令,若不写,那么程序将会陷入无限循环。
函数的设计
设计模式(Design Pattern)中有一个原则“单一职责原则”(Single Responsibility Principle),适用于函数的设计,不要让一个函数执行很多任务。