分类: LINUX
2009-07-11 18:01:30
有两种格式可以声明一个bash函数。一种是旧的Bourne shell方式,函数名后面跟有一对空的圆括号,再跟函数定义。新的格式(Korn shell方式)是用function关键字后跟函数名以及函数定义。如果使用新方法,圆括号是可选的。函数的定义由花括号中的一组命令构成,命令之间以分号分隔。最后那条命令必须以分号终结。花括号两侧的空格是必需的。传递给函数的任何参数被当作函数内的位置参量。一个函数的位置参量对函数来说是局部的。内置函数local允许在函数定义中创建局部变量。函数还可以递归,可以无限次调用它本身。
格式
function_name () { commands ; commands; }
function function_name { commands ; commands; }
function function_name () { commands ; commands; }
范例13-81
1 $ function greet { echo "Hello $LOGNAME, today is $(date)"; }
2 $ greet
Hello ellie, today is Wed Jul 14 14:56:31 PDT 2004
3 $ greet () { echo "Hello $LOGNAME, today is $(date)"; }
4 $ greet
Hello ellie, today is Wed Jul 14 15:16:22 PDT 2004
5 $ declare -f
declare -f greet()
{
echo "Hello $LOGNAME, today is $(date)"
}
6 $ declare -F
declare -f greet
7 $ export -f greet
8 $ bash # Start subshell
9 $ greet
Hello ellie, today is Wed Jul 14 17:59:24 PDT 2004
说明
1. 关键字function后跟函数名greet。函数定义用花括号括起来。在左花括号后必须有一个空格。同一行的语句用分号来终结。
2. 当调用greet函数时,括在花括号中的命令在当前shell环境下执行。
3. 用Bourne shell格式再次定义greet函数,函数名后跟一对空的圆括号,然后是函数定义。
4. greet函数再次被调用。
5. 带-f开关的declare命令列出在该shell中定义的所有函数以及它们的定义。
6. 带-F开关的declare命令只列出函数名。
7. 带-f开关的export命令使函数成为全局的。即子shell也可以获得。
8. 启动一个新的bash shell。
9. 在这个子shell中函数是定义的,因为它已经被导出。
范例13-82
1 $ function fun {
echo "The current working directory is $PWD."
echo "Here is a list of your files: "
ls
echo "Today is $(date +%A).";
}
2 $ fun
The current working directory is /home.
Here is a list of your files:
abc abc123 file1.bak none nothing tmp
abc1 abc2 file2 nonsense nowhere touch
abc122 file1 file2.bak noone one
Today is Wednesday.
3 $ function welcome { echo "Hi $1 and $2"; }
4 $ welcome tom joe
Hi tom and joe
5 $ set jane anna lizzy
6 $ echo $*
jane anna lizzy
7 $ welcome johan joe
hi johan and joe
8 $ echo $1 $2
johan joe
9 $ unset -f welcome # unsets the function
说明
1. 命名并定义函数fun。关键字function后跟一个函数名和括在花括号内的一组命令。命令分列在单独的行。如果它们列在同一行里,就必须用分号来分隔。在第一个花括号后必须有一个空格,否则将出现语法错误。必须在一个函数使用前就定义它。
2. 当被调用时,函数的行为和脚本的相同。依次执行函数定义中的每条命令。
3. 有两个位置参量用于函数welcome。当参数传递给函数时,将给位置参量赋实际值。
4. 函数的参数tom和joe被分别赋给$1和$2。一个函数里的位置参量是函数私有的,而且不会影响函数外的任何使用。
5. 在命令行设置位置参量。这些变量对在函数中设置的那些没有任何影响。
6. $*显示当前设置的位置参量值。
7. 调用函数welcome。赋给位置参量的值是johan和joe。
8. 在命令行赋值的位置参量不受在函数中定义的那些参数的影响。
9. 带-f开关的unset内置命令将清除函数定义。
要列出函数和它们的定义,就要用declare命令。在bash 2.x及以上版本中,declare –F仅列出函数名。函数及其定义将和输出变量、局部变量一起显示在输出结果中。函数及其定义可以用unset -f命令来清除。