天天看点

Linux命令行与shell脚本编程大全笔记(创建函数)

基本的脚本函数

# 第一种方式
function fname {  #脚本中定义的函数名称必须有唯一的名称 fname 与 { 之间必须有空格
	commands
}
# 另外一种方式
fname() {
	commands
}

# 如果在函数定义前使用未定义的函数,会收到一条错误信息
# 如果函数在之前已经定义过,则新定义的函数会覆盖之前的定义
           

返回值

$?

函数的退出状态码,是函数最后一条命令返回的退出状态码

return

退出函数并返回特定的退出状态码(整数)

$?

接函数返回值的注意点:

1.

函数结束直接取返回值,中间不可有任何命令

2.

退出状态码范围

0~255

使用函数输出

val1=10
val2=30
my_fname(){
	echo $[ $1 * $2 ]
}
result=$(my_fname  $val1 $val2) # 结果为300
# 函数用echo来显示计算的结果,脚本会获取函数的输出,而不是退出状态码
# 可以返回浮点值和字符串值
           

在函数中使用变量

func1 $val1 100

函数使用特殊的变量作为自己的参数值,无法使用脚本在命令行的参数值

全局变量

是在shell脚本中任何地方都有效的变量,函数外定义的变量可以在函数内访问

*

函数内定义的变量,在调用该函数后,该变量也可以在函数外访问

局部变量

,只要在函数的声明前加上

local

关键字即可,该变量只可以在函数内部使用

数组变量和函数

# 必须将数组变量的值分解为单个值,将这些值作为函数参数,在函数内,可将参数重组成一个新变量
function addarray{
	newarray=($(echo [email protected]))
	for i in ${newarray[*]};do
	done
}
myarray=(1 2 3 4 5)
arg1=(echo ${myarray[*]})
addarray $arg1  # 或者 addarray ${myarray[*]}

# 从函数返回数组
function returnarr{
	local i 
	for (( i = 0; i <= 10; i++ )) #  C语言风格for循环
	{
		newarray[$i]=$[ $i * 2 ]
	}
	echo ${newarray[*]}
}

result=$(returnarr)
echo "result:${result[*]}"
           

函数递归

# 计算 X 的阶乘
function factorial{
	if [ $1 -eq 1 ];then
		echo 1
	else
		local temp=$[ $1 - 1 ]
		local result=$(factorial $temp)
		echo $[ $1 * $result ]
}
           

创建库

*

创建库函数文件

myfuncs

,里面有几个函数

(add, div, mult)

*

在脚本文件中运行库文件(

source ./myfuncs

*source

在当前shell上下文中执行命令,而不是创建新的shell,有个快捷操作符(

.

点操作符)

#!/bin/bash
. ./myfuncs

val1=1
val2=2
add $val1 $val2
           

在命令行上使用函数

*单行方式定义函数

#function divem { echo $[ $1 * $2 ]; }

每个命令后面都要加上分号

*多行方式定义函数

function divem{
>echo $[ $1 * $2]
>}
divem 1 2 # 执行
           

*

如果函数名和内建命令或者另一个命令相同的名字,函数将会覆盖之前的命令

在.bashrc中定义函数

. /home/root/ymwork/my_shell_function

将命令放到

.bashrc

脚本最后一行,shell可以使用定义好的函数,甚至不需要在子shell中对库文件使用

source