函数定义格式:

和js有点类似,不过在 shell 中 function 关键字是可选的。

如:

sum
{
    // shell 语句
}
 
 
  
 
 
function sum()
{
    // shell 语句
}

 

函数调用方法:

sum 参数1 参数2 ...

  

获取函数参数:

这个和我们以往的经验可能不太一样,shell 中获取函数参数的方式有点特别。

一般语言中,都是在函数名后面的括号中给定一个变量名去接收函数参数。

而在 shell 中,获取函数参数的方式是在函数体中使用美元符号加上数字获取,如 $1  获取第一个参数,$2 获取第二个参数,依次类推,但是大于或等于 10 的时候,$ 后面的数字要加上大括号,如 ${10}。

如:

sum()
{
    echo $(($1 + $2))
}

 

与 $ 有关的其他参数:

参数处理

说明

$#  

传递给函数的参数总个数

$*  

 以一个字符串显示所有的参数

$$  

 脚本运行的当前进程的ID号

$!

 后台运行的最后的进程的ID号

$@

 与$*相同,但是在使用时加引号,并在引号中返回每个参数

$-

 显示 shell 使用的当前选项,如:我们使用 set -x 的时候,$- 中会包含 x

$?

 显示上一条命令的退出状态,或者说是返回值,没有返回值并正常运行的时候会返回 0


 如:

#!/bin/bash

funcA()
{
    return 123
}

sum()
{
    echo "参数总个数: $#"
    echo "字符串形式显示所有参数: $*"
    echo "脚本运行的进程ID号: $$"
    echo "字符串形式显示所有参数: $@"
    echo "shell脚本运行的选项: $-"
    funcA
    echo "上一个语句的返回值: $?"
    echo $(($1 + $2))
}

sum 1 2

上面的代码会输出:

参数总个数: 2 字符串形式显示所有参数: 1 2 脚本运行的进程ID号: 1408 字符串形式显示所有参数: 1 2 shell脚本运行的选项: hB 上一个语句的返回值: 123 3

  

脚本中获取任意多的参数:

#!/bin/bash

sumMulti()
{
    sum=0
    while [ "$1" != "" ]
    do
        sum=$(($sum+$1))
        shift
    done
    echo $sum;
}

sumMulti 1 2 3 4 5

while 后面的中括号左右需要有空格,语法需要,书写格式没有一般语言自由,

并且赋值表达式的等号左右不能有空格,有空格的语句,shell会将第一个词作为 shell 命令,然后将第一个空格后面的任何内容当作 shell 命令的参数,这也是 shell 的独特之处,理解这一点对于 shell 的学习非常关键!如上面的 sum=0 如果写作 sum = 0,会提示诸如下面的内容:

sum: =: No such file or directory
sum: 0: No such file or directory

也就是说 shell 在运行这个语句的时候,实际上是把 sum 当作 shell 命令了(当然函数也可以这么调用)。

 

shift 的作用是将第一个参数从参数列表中移除。

 

获取函数返回值:

1、通过 return 获取返回值:

#!/bin/bash

sumMulti()
{
    sum=0
    while [ "$1" != "" ]
    do
        sum=$(($sum+$1))
        shift
    done
    return $sum;
}

sumMulti 1 2 3 4 5
echo "通过return获取返回值: $?"

我们可以使用上面提到的 $? 获取上一个函数执行的返回值。

 

2、通过 echo 获取返回值:(原理: 我们可以使用反引号获取命令执行的输出内容)

#!/bin/bash

sumMulti()
{
    sum=0
    while [ "$1" != "" ]
    do
        sum=$(($sum+$1))
        shift
    done
    echo $sum;
}

sum=`sumMulti 1 2 3 4 5`
echo "通过echo获取返回值: $sum"

上面函数调用那一行也可以换做:两种写法差不多

sum=$(sumMulti 1 2 3 4 5)