目录
- 基础命令
- 变量
- 创建并运行脚本
- 条件
- 循环
- 函数
- 其他(read、mktemp、trap)
函数
首先回顾以下以前的一个例子。这个例子用来演示数组元素删除和数组销毁。这个例子中循环打印数组代码虽然一样,但是写了三遍,完全不符合高内聚低耦合的要求。因此,Shell脚本提供了函数来解决这个问题。
array[0]=0
array[1]=1
array[2]=2
# 打印全数组内容
for item in ${array[@]}
do
echo ${item}
done
# 删除数组索引位置1的元素,打印内容为1,2
unset array[1]
for item in ${array[@]}
do
echo ${item}
done
# 删除整个数组,打印内容为空
unset array
for item in ${array[@]}
do
echo ${item}
done
将上述代码修改为使用函数优化以后,可以转变为:
printArray() {
for item in ${array[@]}
do
echo ${item}
done
}
array[0]=0
array[1]=1
array[2]=2
# 打印全数组内容
printArray
# 删除数组索引位置1的元素,打印内容为1,2
unset array[1]
printArray()
# 删除整个数组,打印内容为空
unset array
printArray()
删除函数
unset printArray
函数参数
函数体内可以使用参数变量,获取函数参数。函数的参数变量,与脚本参数变量是一致的。
$1~$9:函数的第一个到第9个的参数。$0:函数所在的脚本名。$#:函数的参数总数。$@:函数的全部参数,参数之间使用空格分隔。$*:函数的全部参数,参数之间使用变量$IFS值的第一个字符分隔,默认为空格,但是可以自定义。
如果函数的参数多于9个,那么第10个参数可以用${10}的形式引用,以此类推。
#!/bin/bash
printArray() {
echo "printArray: $@"
echo "$0: $1 $2 $3 $4"
echo "$@"
echo "$# arguments"
return -1
}
alice 1 2 3 4
echo $?
变量的作用域
函数不仅可以直接读取和修改全局变脸给,比如上面所看到到array,其内部的变量也可以直接被外部读取,如果想要设置只有函数内部可以读取的变量,需要使用关键字local
#! /bin/bash
# 脚本 test.sh
fn () {
gvar=0
local lvar
lvar=1
echo "fn: gvar = $gvar, lvar = $lvar"
}
fn
echo "global: gvar = $gvar, lvar = $lvar"