一、函数的一般形式
#!/bin/bash function_name () { commands }
Shell函数是一组可以重复使用的代码,在执行过程中接收参数、操作变量等,返回值可选。一个简单的函数可以包含一条命令或多条命令。函数名和参数列表必须与调用函数时使用的名称和参数列表相同。
二、定义函数
定义函数需要使用`function`关键字,函数的名称不能与shell保留字相同。在函数体中,需要将参数通过`$n`的形式接收并使用。
function func_name { echo $1 echo $2 } func_name hello world
执行结果:
hello world
三、调用函数
在脚本中可以随时调用函数,只需提供函数名即可。如果需要向函数传递一些值,直接将它们作为参数传递,参数之间用空格分隔,在函数体中通过`$n`的形式访问到传递的参数。
#!/bin/bash function myFunc { echo "Hello, $1" } myFunc 'world'
执行结果:
Hello, world
四、函数返回值
函数可以返回一个值给调用者,值用于函数后进行处理。
#!/bin/bash function myFunc { echo "Hello, $1" return 10 } myFunc 'world' echo "return value is $?"
执行结果:
Hello, world return value is 10
五、函数参数
参数传递可以包括固定数量的参数和可变数量的参数。传递的参数通过`$1`、 `$2` 等接收,`$?` 获取函数返回状态。
固定参数
function myFunc { echo "1st arg: $1, 2nd arg: $2" } myFunc 'hello' 'world'
执行输出:
1st arg: hello, 2nd arg: world
可变数量参数
可变数量参数函数在传递参数时不需要提前告诉该函数有多少参数。通过 "$@" 来引用,"$*" 也可用但稍微有点区别。利用 shift 可以很方便的遍历所有的参数,shift 命令会将所有参数左移,也就是原本的 $2 会变成 $1,$3 变成 $2,以此类推,而 $0 表示的是脚本本身的名字。
function myFunc { echo "Your name is: $1" shift echo "Age : $1" } myFunc 'John' '20'
执行结果:
Your name is: John Age : 20
六、函数使用场景
函数可以被用于编写高级脚本,将程序组织为易维护、易修改,同时也改善脚本的可重用性。
批量处理文件夹
#!/bin/bash countFiles () { local DIR=$1 local NUM_FILES=$(ls -a $DIR | wc -l) echo "Number of files in $DIR: $NUM_FILES" } for D in *; do if [ -d "${D}" ]; then countFiles $D fi done
执行结果:
Number of files in folder1: 5 Number of files in folder2: 10
批量重命名文件
#!/bin/bash function renameFiles { counter=1 for file in *.$1; do if [ -e "$file" ]; then mv -n "$file" "$2$counter.$1" let counter++ fi done } renameFiles jpg prefix
执行结果:
*前执行结果
a.jpg b.jpg c.jpg
*后执行结果
prefix1.jpg prefix2.jpg prefix3.jpg
七、总结
Shell函数可以在Shell脚本中被定义和调用。定义后可以像其他命令一样调用,并且可以根据需要向函数传递参数以使其调用的功能更加灵活。合理地使用Shell函数可以提高脚本的可维护性和可重用性