Shell:创建函数

1. 创建函数的两种方式

1.1 创建函数

有两种格式可以用来在bash shell脚本中创建函数。脚本中定义的每个函数都必须有一个唯一的名称

  • 第一种格式采用关键字function,后跟分配给该代码块的函数名。name属性定义了赋予函数的唯一名称。
function name { 
	commands
}
  • 第二种格式更接近于其他编程语言中定义函数的方式。
name() { 
	commands 
}

1.2 使用函数

$ cat test1
#!/bin/bash
# using a function in a script
function func1 {
   echo "This is an example of a function"
}
count=1
while [ $count -le 5 ]
do
	func1
    count=$[ $count + 1 ]
done

echo "This is the end of the loop"
func1
echo "Now this is the end of the script"
$
$ ./test1
This is an example of a function
This is an example of a function
This is an example of a function
This is an example of a function
This is an example of a function
This is the end of the loop

2. 返回值

2.1 默认退出状态码

记住,$?变量会返回执行的最后一条命令的退出状态码。

  • 函数运行成功,默认退出码0
  • 函数运行失败,默认退出码1

2.2 使用return命令

bash shell使用return命令来退出函数并返回特定的退出状态码。return命令允许指定一个整数值来定义函数的退出状态码,从而提供了一种简单的途径来编程设定函数退出状态码。

  • 记住,函数一结束就取返回值;
  • 记住,退出状态码必须是0~255
#!/bin/bash
db1(){
	read -p "Enter a value: " value
	echo "doubling the value"
	return $[ $value * 2 ]
}

db1
echo The new value is $?

2.3 使用函数输出 - echo

新函数会用echo语句来显示计算的结果。该脚本会获取dbl函数的输出,而不是查看退出状 态码。

$ cat test5b
#!/bin/bash
# using the echo to return a value
function dbl {
   read -p "Enter a value: " value
   echo $[ $value * 2 ]
}
result=$(dbl)
echo "The new value is $result"
$
$ ./test5b
Enter a value: 200
The new value is 400
$
$ ./test5b
Enter a value: 1000
The new value is 2000

3. 函数变量、传参

3.1 向函数传递参数

bash shell会将函数当作小型脚本来对待。这意味着你可以像普通脚 本那样向函数传递参数

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

尽管函数也使用了$1和$2变量,但它们和脚本主体中的$1和$2变量并不相同。要在函数中
使用这些值,必须在调用函数时手动将它们传过去

#!/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 15: "
value=$(addem 10 15)
echo $value
echo -n "Let's try adding just one number: "
value=$(addem 10)
echo $value
echo -n "Now trying adding no numbers: "
value=$(addem)
echo $value
echo -n "Finlly, try adding three numbers: "
value=$(addem 10 15 20)
echo $value

输出:

Adding 10 and 15: 25
Let's try adding just one number: 20
Now trying adding no numbers: -1
Finally, try adding three numbers: -1

3.2 全局变量、局部变量

全局变量是在shell脚本中任何地方都有效的变量。如果你在脚本的主体部分定义了一个全局 变量,那么可以在函数内读取它的值。类似地,如果你在函数内定义了一个全局变量,可以在脚 本的主体部分读取它的值。

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

#!/bin/bash

function func1 {
	local temp=$[ value + 5 ]
	result=$[ $temp * 2 ]
}

temp=4
value=6

func1

echo "The result is $result"
if [ $temp -gt $value ]
then
	echo "temp is larger"
else
	echo "temp is samller"
fi

输出

The result is 22
temp is smaller

3.3 向函数传参数组

该脚本用$myarray变量来保存所有的数组元素,然后将它们都放在函数的命令行上。该函 数随后从命令行参数中重建数组变量。在函数内部,数组仍然可以像其他数组一样使用

#!/bin/bash

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[*]}

输出

The original array is 1 2 3 4 5
The new array value is: 1 2 3 4 5

4. 引入自定义函数 - source

bash shell允许创建函数库文件,然后在多个脚本中引用该库文件。

库文件myfuncs,它定义了3个简单的函数。

#!/bin/bash
# my script functions
function addem {
       echo $[ $1 + $2 ]
}
function multem {
       echo $[ $1 * $2 ]
}
function divem {
    if [ $2 -ne 0 ]
    then
          echo $[ $1 / $2 ]
    else
          echo -1
    fi
}

使用函数库的关键在于source命令。source命令会在当前shell上下文中执行命令,而不是 创建一个新shell。可以用source命令来在shell脚本中运行库文件脚本。这样脚本就可以使用库 中的函数了。

source命令有个快捷的别名,称作点操作符(dot operator)。要在shell脚本中运行myfuncs 库文件,只需添加下面这行:

. ./myfuncs

这个例子假定myfuncs库文件和shell脚本位于同一目录。如果不是,你需要使用相应路径访 问该文件。这里有个用myfuncs库文件创建脚本的例子。

$ cat source.sh
#!/bin/bash

. ./myfuncs

value1=10
value2=5

result1=$(addem $value1 $value2)
echo $result1

输出

15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值