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