【读书笔记】Linux命令行与Shell脚本编程大全--创建函数

1.基本的脚本函数

函数是一个脚本代码块,你可以为其命名并在代码中任何位置重用。

1.1 创建函数

创建函数格式如下:

function name {
	commands
}

name属性定义了赋予函数的唯一名称,函数名不能重名。
ps:函数名必须是唯一的,如果重定义了函数,新定义会覆盖原来函数的定义,这一切不会产生任何错误消息
commands是构成函数的一条或多条bash shell命令。

另一种格式如下:

name {
	commands
}

1.2 使用函数

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

function func {
	echo "func is used"
}

func

#func is used

2.返回值

bash shell会把函数当作一个小型脚本,运行结束时会返回一个退出状态码。有如下三种方法为函数生成退出状态码。

2.1 默认退出状态码

默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码。
在函数执行结束后,可以用标准变量$?来确定函数的退出状态码。

2.2 使用return命令

bash shell使用return命令来退出函数并返回特定的退出状态码。
return命令允许指定一个整数值来定义函数的退出状态码。

ps:使用return命令需要注意如下几点:

  1. 函数一结束就取返回值;
  2. 退出状态码必须是0~255;
  3. $?变量会返回执行的最后一条命令的退出状态码。

2.3 使用函数输出–将函数的输出保存到变量中

正如可以将命令的输出保存到shell变量中一样,也可以对函数的输出采用同样的处理办法。
可以用这种技术来获得任何类型的函数输出,并将其保存到变量中。

ps:用反引号来获取输出的数据。

eg:

function revalue {
	echo "3.15"			#bash会自动省略这里的输出,如果你用echo语句生成这条消息来向用户查询,那么它会与输出值一起被读进shell变量中
}

result=$(revalue)		# 这里对函数的调用需要用括号包括并取值
echo $result

#3.15

3.在函数中使用变量

3.1 向函数传递参数

函数可以使用标准的参数环境变量来表示命令行上传给函数的参数
即函数名会在$0中定义,函数命令行上的任何参数都会通过$1,$2等定义。
特殊变量$#表示传给函数的参数数目。

其格式如下:

func $value 10    #表示向函数名为func的函数传递变量value和10这2个参数

notice:

  1. 在脚本中指定函数并使用函数参数时,必须将参数和函数放在同一行。
  2. 由于函数使用特殊参数环境变量作为自己的参数值,因此它无法直接获取脚本在命令行中的参数值

3.2 在函数中处理变量–全局/局部变量

全局变量:
全局变量是在shell脚本中任何地方都有效的变量。

局部变量(local)
local关键字保证了变量只局限在该函数中。如果脚本中在该函数之外有同样名字的变量,那么shell将会保持这两个变量的值是分离的。

4.数组变量和函数(数组变量如何在函数中自由走动)

4.1 向函数传数组参数–拆分、组合

如果试图将数组变量作为函数参数,函数只会取数组变量的第一个值
必须将该数组变量的值分解成单个的值,然后将这些值作为函数参数使用。在函数内部,可以将所有的参数重新组合成一个新的变量。

eg:

$ cat test10 
#!/bin/bash 
# array variable to function test 
function testit { 
 local newarray 
 newarray=(;'echo "$@"') 			#这里将所有的参数重新组合成一个新的变量,这个写法有大佬在评论区详细介绍下嘛,感谢
 echo "The new array value is: ${newarray[*]}" 
} 
myarray=(1 2 3 4 5) 
echo "The original array is ${myarray[*]}" 
testit ${myarray[*]} 
$ 
$ ./test10 
The original array is 1 2 3 4 5 
The new array value is: 1 2 3 4 5 
$

4.2 从函数返回数组–拆分、组合

同向函数传递数组参数的方法一样,函数用echo语句来按正确顺序输出单个数组值,然后脚本再将它们重新放进一个新的数组变量中。

eg:

$ cat test12 
#!/bin/bash 
# returning an array value 
function arraydblr { 
 local origarray 
 local newarray 
 local elements 
 local i 
 origarray=($(echo "$@")) 
 newarray=($(echo "$@")) 
 elements=$[ $# - 1 ] 
 for (( i = 0; i <= $elements; i++ )) 
 { 
 newarray[$i]=$[ ${origarray[$i]} * 2 ] 
 } 
 echo ${newarray[*]} 
} 
myarray=(1 2 3 4 5) 							#原始数组
echo "The original array is: ${myarray[*]}" 
arg1=$(echo ${myarray[*]}) 						#将原始数组拆分给变量arg1
result=($(arraydblr $arg1)) 					# 1.将带有原始数组数据的变量arg1作为参数传递给函数arraydblr。2.将函数arraydblr的返回值按正确顺序输出单个数组值,然后脚本再将它们重新放进一个新的数组变量中
echo "The new array is: ${result[*]}" 
$ 
$ ./test12 
The original array is: 1 2 3 4 5 
The new array is: 2 4 6 8 10

5.函数递归

局部函数变量的一个特性是自成体系。
除了从脚本命令行处获得的变量,自成体系的函数不需要使用任何外部资源。
这个特性使得函数可以递归地调用,也就是说,函数可以调用自己来得到结果。

eg:

function factorial { 
 if [ $1 -eq 1 ] 
 then 
 echo 1 
 else 
 local temp=$[ $1 - 1 ] 
 local result=$(factorial $temp) 
 echo $[ $result * $1 ] 
 fi
}  
read -p "Enter value: " value 
result=$(factorial $value) 
echo "The factorial of $value is: $result" 
$ 
$ ./test13 
Enter value: 5 
The factorial of 5 is: 120 
$

注:暂停更,目前所学够支持日常使用。

6.创建库

7.在命令行上使用函数

7.1 在命令行上创建函数

7.2 在.bashrc文件中定义函数


申明:文中没特殊注明,图皆来自Linux命令行与shell脚本编程大全<第三版>。

发布了91 篇原创文章 · 获赞 17 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_23327993/article/details/104669019