一、环境说明
系统:ubuntu12.04TLS
bash版本:GNU bash, 版本 4.2.25(1)-release (x86_64-pc-linux-gnu)
二、函数定义结构[function] function_name()
{
command1
......
commandn
}
关键字function可以省略
三、函数调用方式function_name arg1 arg2 arg3 ....
说明:
(1)shell脚本是顺序解释执行的,所以使用前需要定义。函数要在使用前定义。
函数名可以和系统中的命令重复,shell解释时首先在shell文件中查找,找到就执行,否则根据 path路径去查找系统命令
函数只在当前shell中起作用,不输出到子shell中
(2)函数中参数的使用
<1>$0, $1,......$n 表示命令行参数
$0表示函数名字
$1表示arg1
$2表示arg2
......
这个和C语言main函数char *argv[]相似,argv[0]表示程序名,argv[1]表示第一个参数...
<2> $# 命令行参数个数(不包含函数名/文件名)
$? 前一个命令的退出状态
$$ 正在执行进程的ID
$@ 包含所有命令行参数“$1,$2,....”, 单独引用
$* 包含所有命令行参数“$1,$2,.....”, 整体引用
(3)变量
全局变量:在脚本的其他任何地方都能够访问该变量,默认声明的变量都是全局变量。
局部变量:只能在声明变量的作用域内访问。使用 local 关键字声明局部变量。
(4)函数返回值
<1>不指定返回值,则返回值为函数中最后一条命令执行的结果
<2>显示使用return 返回0 - 255
四、调试
(1)只做语法检测,不执行脚本bash -n ./script_name.sh
(2)启动调试bash -x ./script_name.sh
(3)局部调试
修改脚本,将要调试的部分用set -x 和set +x包裹起来set -x
...
command
...
set +x
五、实例#!/bin/bash
j=9 //全局变量
function sum()
{
echo "参数总共有$#个"
echo "函数名为:$0"
for i in $@
do
echo "参数:$i"
done
echo "pid=$$"
echo "in func j=$j"
local j=8 #在这之前对j的操作就是对全局变量j的操作
echo "local j=$j"
#这以后对j的操作就是对这个局部变量的操作
m=10 #m为全局变量
}
sum 1 2 3 4 5 #函数调用
echo "global j=$j"
echo "global m=$m"
执行 ./script.sh
结果为:
参数总共有5个
函数名为:./test.sh
参数:1
参数:2
参数:3
参数:4
参数:5
pid=8633
in func j=9
local j=8
global j=9
global m=10