Shell脚本入门教程-函数篇

379 阅读1分钟

目录

  1. 基础命令
  2. 变量
  3. 创建并运行脚本
  4. 条件
  5. 循环
  6. 函数
  7. 其他(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"