一朝shell函数倾斗转星移任我行

Friday, April 17, 2020

函数

函数(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),适用于函数的设计,不要让一个函数执行很多任务。

LinuxShell

Rsync+inotify数据实时同步

循环往复shell开路

comments powered by Disqus