16.2 带参数的函数

16.2.1 位置参数

在16.1.2节中,checkFileExist.sh脚本中定义了checkFileExist函数,但是可以看到这个脚本实际上写死了FILE变量,这会造成想要判断不同的文件是否存在时,需要修改脚本中的FILE变量——也就是要对代码本身的内容进行修改,这也是典型的代码和数据没有分开而导致的问题。事实上,可以通过定义带参数的函数解决这个问题。在Shell中,向函数传递参数也是使用位置参数来实现的。

使用带参数的函数修改之前的checkFileExist.sh脚本为checkFileExist_v2.sh,注意后面执行脚本时的传参方式。


  1. [root@localhost ~]# cat checkFileExist_v2.sh

  2. #!/bin/bash

  3. function checkFileExist(){

  4. if [ -f $1 ]; then

  5. return 0

  6. else

  7. return 1

  8. fi

  9. }

  10. echo "Call function checkFileExist"

  11. checkFileExist $1

  12. if [ $? -eq 0 ]; then

  13. echo "$1 exist"

  14. else

  15. echo "$1 not exist"

  16. fi

  17. #

  18. 执行脚本时,通过直接向脚本传递文件全路径的方式传递参数

  19. #

  20. 可以看到这种方式不会因为测试文件的不一样而修改脚本本身的内容,非常简单

  21. [root@localhost ~]# bash checkFileExist_v2.sh etcnotExistFile

  22. Call function checkFileExist

  23. etcnotExistFile not exist

  24. [root@localhost ~]# bash checkFileExist_v2.sh etcpasswd

  25. Call function checkFileExist

  26. etcpasswd exist


下面的例子可以接受两个参数:$1和$2,该脚本将计算出$1的$2次方的值。


  1. [root@localhost ~]# cat power.sh

  2. #!/bin/bash

  3. function power(){

  4. RESULT=1

  5. LOOP=0

  6. while [[ "$LOOP" -lt $2 ]]

  7. do

  8. let "RESULT=RESULT*$1"

  9. let "LOOP=LOOP+1"

  10. done

  11. echo $RESULT

  12. }

  13. echo "Call function power with parameters"

  14. power $1 $2

  15. #

  16. 计算2

  17. 2

  18. 次方

  19. [root@localhost ~]# bash power.sh 2 2

  20. Call function power with parameters

  21. 4

  22. #

  23. 计算3

  24. 3

  25. 次方

  26. [root@localhost ~]# bash power.sh 3 3

  27. Call function power with parameters

  28. 27