函数定义格式:
和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)