Skip to content

14. 函数

bash 函数定义语法如下:

[ function ] funname [()] {
    action;
    [return int;]
}
  • 函数定义时, function 关键字可有可无。
  • 函数返回值 - return 返回函数返回值,返回值类型只能为整数(0-255)。如果不加 return 语句,shell 默认将以最后一条命令的运行结果,作为函数返回值。
  • 函数返回值在调用该函数后通过 $? 来获得。
  • 所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至 shell 解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
#!/usr/bin/env bash

calc() {
    PS3="choose the oper: "
    select oper in + - \* /; do                # 生成操作符选择菜单
        echo -n "enter first num: " && read x  # 读取输入参数
        echo -n "enter second num: " && read y # 读取输入参数
        exec
        case ${oper} in
        "+")
            return $((${x} + ${y}))
            ;;
        "-")
            return $((${x} - ${y}))
            ;;
        "*")
            return $((${x} * ${y}))
            ;;
        "/")
            return $((${x} / ${y}))
            ;;
        *)
            echo "${oper} is not support!"
            return 0
            ;;
        esac
        break
    done
}
calc

# $? 获取 calc 函数返回值
echo "the result is: $?"

# Output: (注: 这个是交互数据, 需要命令行运行)
# 1) +
# 2) -
# 3) *
# 4) /
# choose the oper: 1
# enter first num: 2
# enter second num: 3
# the result is: 5

位置参数

位置参数 是在调用一个函数并传给它参数时创建的变量。

位置参数变量表:

变量描述
$0脚本名称
$1 … $9第 1 个到第 9 个参数列表
${10} … ${N}第 10 个到 N 个参数列表
$*除了
$#不包括
$FUNCNAME函数名称(仅在函数内部有值)
#!/usr/bin/env bash

x=0
if [[ -n $1 ]]; then
    echo "第一个参数为:$1"
    x=$1
else
    echo "第一个参数为空"
fi

y=0
if [[ -n $2 ]]; then
    echo "第二个参数为:$2"
    y=$2
else
    echo "第二个参数为空"
fi

paramsFunction() {
    echo "函数第一个入参:$1"
    echo "函数第二个入参:$2"
}
paramsFunction ${x} ${y}

# Output:
# ./run.sh hello world
# 第一个参数为:hello
# 第二个参数为:world
# 函数第一个入参:hello
# 函数第二个入参:world

执行 ./run.sh hello world ,然后在脚本中通过 $1$2 … 读取第1 个参数、第 2 个参数。。。

函数处理参数

另外,还有几个特殊字符用来处理参数:

参数处理说明
$#返回参数个数
$*返回所有参数

最后,Stack Overflow 上 bash 标签下 有很多你可以学习的问题,当你遇到问题时,也是一个提问的好地方。

运行结果

#!/usr/bin/env bash

# 获取运行结果
# ----------------------------------------
grep <"$(dirname "$0")"/_tmp.txt 'duoli'

echo $?
# Output : 0

说明

创建时间: 2023-01-15 00:28:00 , 最后编辑于 2023-12-05 14:14:00