函数

在大多数编程语言中,都会存在函数的概念,如C语言中的printf()。在编程过程中,将一段会重复使用且为完成特定功能的语句写在函数中,可以减少代码的长度提高可读性。在ShellScript中,除了使用函数外有另一种选择,即将一个较长的脚本分为多个小脚本文件,但这种方法的效率会比使用函数低,在实际编写中可根据需要选择使用函数或者分文件。

在ShellScript中函数的定义与使用的方法也非常简单。定义一个函数只需要写出函数名,再跟上一对圆括号和花括号,并将具体的语句写在花括号中;使用函数时只需写出函数名即可调用该函数。

# 函数的定义
function_name() {
  statements
}

# 使用函数
function_name

下面使用一个简单的例子演示函数的使用。

#!/bin/sh

foo() {
  echo "Function foo is executing"
}

echo "script starting"
foo
echo "script ended"

程序先是定义(不执行)了函数foo,然后开始执行下面的代码。执行完echo "script starting后执行foo将调用函数foo,于是程序将执行函数foo中的语句。执行该程序,将得到以下结果。

script starting
Function foo is executing
script ended

函数参数与返回值

在函数的使用中经常需要传递参数和返回值。在定义函数时,无需像其它语言一样预先定义函数的个数及名称,而是在函数中直接使用参数变量即可,参数变量参见Shell Script介绍及变量使用。在调用函数时,若需要传递参数,只需在函数名后加上参数,如function_name arg1 arg2 ...。函数的值返回方法与其它大部分语言类似,即return return_value。下面将使用一个小程序演示函数参数及返回值的使用。

#!/bin/sh

yes_or_no() {
  echo "Is your name $* ?"
  while true
  do
    echo -n "Enter yes or no: "
    read x
    case "$x" in
      [yY] | [yY][eE][sS] )
        return 0
        ;;
      [nN] | [nN][oO] )
        return 1
        ;;
      * )
        echo "answer yes or no"
        ;;
    esac
  done
}

if yes_or_no "xxx"
then
  echo "Hi xxx, nice name"
else
  echo "Never mind"
fi

exit 0

下面将执行两次程序,分别输入yes与no,结果如下。

# first time
Is your name xxx ?
Enter yes or no: yes
Hi xxx, nice name

# second time
Is your name xxx ?
Enter yes or no: no
Never mind