##1.创建函数 函数的本质就是一个准备好了的代码块,有两种方式可以创建函数:
- 关键字格式
function name {
commands
}
- 函数名后加空括号(更接近其他编程语言)
name() {
commands
}
####1.使用函数 例子:
#!/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 is the end of the script"
#
- 需要注意的是,函数名必须唯一,如果重定义了函数,新的定义会覆盖旧的定义
####2.返回值(以及使用return命令)
- bashshell会把函数当成一个小型脚本,故而有返回值
- 默认情况下,函数的状态码是最后一条命令的返回的退出码
#!/bin/bash
#
func1() {
echo "Tring to display a non-exitent file"
ls -l badfile
}
#
echo "testing the function:"
func1
echo "The exit status is: $?" #使用$?获得返回值
#这里将返回2,因为ls 失败
#
#如果将函数内命令的次序交换
func1() {
ls -l badfile
echo "Tring to display a non-exitent file"
}
#脚本最后将返回0,因为echo执行成功
使用return命令允许指定一个整数来定义返回值,但要注意:
- 函数一结束就要取返回值
- 退出码必须是0-255之间
####3.使用函数进行输出 命令的输出可以保存到shell,函数的输出也可以保存到shell
#!/bin/bash
#using the return command in a function
#
function dbl {
read -p "Enter a value " value
echo $[ $value * 2 ] #整数运算
}
#
result=$(dbl) #获取输出
echo "The new value is $result"
- 如果输出有多个的话,都会在最后显示出来,这时候就要注意了。
##2.在函数中使用变量和数组 ####1.使用变量
- 在脚本中指定函数时,参数和函数要在同一行:func1 $value1 10
#!/bin/bash
#passing parameter to a function
#一个简单的例子
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
echo -n "Let's try adding just one number:"
value=$(addem 10)
echo $value
echo
echo -n "Now trying adding no numbers:"
value=$(addem)
echo $value
echo
echo -n "Finally,try adding three numbers:"
value=$(addem)
echo $value
- 函数无法直接获取脚本在命令行中的参数,所以要在调用函数时手动传过去
#!/bin/bash
#trying to access script parameters inside a function
#
function func7 {
echo $[ $1 * $2 ]
}
#
if [ $# -eq 2 ]
then
value=$(func7 $1 $2) #手动传过去
echo "The result is $value"
else
echo "Usage: badtest1 a b"
fi
####2.在函数中处理变量 函数中有两种变量,全局变量和局部变量
- 默认情况下是全局变量,对整个脚本都适用,但这有时会有麻烦
- 在函数内的变量前叫上local就可以将变量声明称局部变量,只在函数内使用
#!/bin/bash
#demonstrating the local keyword
#
function func1 {
local temp=$[ $value +5 ] #声明成局部变量
result=$[ $temp * 2 ]
}
#
temp=4 #外面的这个变量与函数里面的同名变量会被区分开来
value=6
#
func1
echo "The result is $result"
if [ $temp -gt $result ]
then
echo "temp is larger"
else
echo "temp is smaller"
fi
####3.在函数中处理数组变量 在函数中如果试图把数组变量当成函数参数的话,函数只会取第一个值。所以,我们需要将数组打散,然后再重新组合起来。
#!/bin/bash
#adding values in an array
#
function addarray {
local sum=0
local newattay
newarray=($(echo "$@"))
for value in ${newarray[*]}
do
sum=$[ $sum + $value ]
done
echo $sum
}
#
myarray=(1 2 3 4 5 6)
echo "The original array is: ${myarray[*]}"
arg1=$(echo ${myarray[*]}) #利用echo将数组一个个输出
result=$(addarray $arg1)
echo "The result is $result"
从函数返回数组也是一样的
#!/bin/bash
#returning an array value
#
function arraydblr {
local origarray
local newarray
local elements
local i
origarray=($(echo "$@"))
newarray=($(echo "$@"))
elements=$[ $# - 1 ]
#这个for的用法很有价值,科学运算里,还是处理数组比较多
for ((i = 0; i <= $elements; i++))
{
newarray[$i]=$[ ${origarray[$i]} * 2 ]
}
echo ${newarray[*]}
}
#
myarray=(1 2 3 4 5 6)
echo "The origiarray is: ${myarray[*]}"
arg1=$(echo ${myarray[*]})
result=($(arraydblr $arg1))
echo "The new array is: ${result[*]}"
#打代码要集中精力,我这里报错了好多,因为我有时拼对了,有时拼错变量名……
####4.函数的递归 这个就是说,函数可以调用自己来得到结果
#!/bin/bash
#阶乘函数,但处理的值不能太大
#
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"
#这种代码,小心无限循环
##3.创建库(source命令) 通过创建函数库,可以在不同脚本中引用函数,极大的减少了工作量。
source命令可以使库在当前shell下使用,它有个快捷方式那就是 .
#!/bin/bash
#这个脚本
#假定myfuncs与脚本在同一个目录下,如果不是,要有相应的路径。
. ./myfuncs #注意点与点之间有一个空格
#
value1=10
value2=5
#
echo "The two numbers are 10 and 5"
#
result1=$(addem $value1 $value2)
result2=$(multem $value1 $value2)
result3=$(divem $value1 $value2)
#
echo
echo "The result of adding them is: $result1"
echo "The result of multiplaying them is: $result2"
echo "The result of dividing them is: $result3"
##4.在命令行上使用函数
要是不小心覆盖了原函数就很糟糕了。太危险了,就不多讲了。
- 在shell中直接读取函数文件,直接使用函数
#将以下代码加入到.bashrc中
#
if [ -r /etc/bashrc ]; then
. /etc/bashrc #注意空格
fi
#
. /home/rich/libraries/myfuncs #自己的库的路径,注意空格
#这样,shell就可以直接使用定义好的函数了
##5.shtool函数库 下载地址:ftp://ftp.gnu.org/gnu/shtool/shtool-2.0.8.tar.gz 安装方式: 解压缩到home中,进入shtool文件夹,运行:
./configure #检查构建shtool库文件所必须的软件
make #构建库文件
make test #检测
sudo make install #安装
函数的部分列表,见书p376
使用的例子:
#!/bin/bash
#
shtool platform #返回平台号,我的是Ubuntu 16.04 (AMD)