我们在写一些功能性脚本的时候,往往会把操作相似或者参数类似行为接近的函数放在同一个shell脚本中,这样管理方便,维护简单,也很清晰。对于这种情况,通常的办法是,在shell脚本中定义所有用到的函数,然后在正文代码中用case语句读入输入的命令函数参数来调用指定的相应函数。这样就达到一个shell脚本使用的强大功能。
下面以一个简单的例子来说明。一个计算器提供了加减乘除的功能:
#!/bin/bash usage="Usage: `basename $0` (add|sub|mul|div|all) parameter1 parameter2" command=$1 first=$2 second=$3 function add() { ans=$(($first + $second)) echo $ans } function sub() { ans=$(($first - $second)) echo $ans } function mul() { ans=$(($first * $second)) echo $ans } function div() { ans=$(($first / $second)) echo $ans } case $command in (add) add ;; (sub) sub ;; (mul) mul ;; (div) div ;; (all) add sub mul div ;; (*) echo "Error command" echo "$usage" ;; esac
上面的这段shell脚本,我们就可以通过传入不同的参数调用达到不同的目的。
[[email protected]]$ ./calculator add 2 3 5 [[email protected]]$ ./calculator sub 2 3 -1 [[email protected]]$ ./calculator mul 2 3 6 [[email protected]]$ ./calculator div 2 3 0 [[email protected]]$ ./calculator all 2 3 5 -1 6 0 [[email protected]]$ ./calculator a 2 3 Error command Usage: calculator (add|sub|mul|div|all) parameter1 parameter2
倘若我们不想每个函数都用同样个数的参数,也就是不同的函数参数不一样时候怎么办?这时候我们可以在函数体的内部读入参数,然后在case后的相应调用语句时候也传入相应的参数。
function double() { ans=$(($1 + $1)) echo $ans } case $command in (dou) double "$first" #you can also use "$2" ;;
当我们需要将command之后的参数原封不动传给调用函数,而却又要忽略command参数,这时候我们可以在调用前使用一次shift命令。shift命令实现将参数左移一位,这样原来的第一个参数就消失了。
如果要将剩下的参数原封不动地传给函数,可以使用参数$*;如果将剩下的参数组成一个命令字符串传给函数,则使用参数"$*"。区别就是是否用引号,有引号时候实际只传了一个参数过去,它是当前shell中shift之后加载的参数的组合,没有引号就是剩下的参数了。
时间: 2024-10-15 16:57:52