Shell函数详解

Shell函数

#!/bin/bash
定义

在被使用之前,函数必须已经被定义

如果函数名重复,后一个函数会覆盖前一个函数

function foo {
	echo "foo"
}

# 也可以不写function关键字
bar {
	echo "bar"
}
参数

运行函数就如同运行一个脚本,它也具有参数和返回值,和在Shell命令行中调用命令是类似的

同样使用$1, $#, $@等变量获取参数

function mul {
	# 连乘参数
    local result="$1"  # 局部变量
    shift
    while [ -n "$1" ]; do
        ((result *= "$1"))
        shift
    done
    echo "$result"
}

function recursive_mul {
	# 递归连乘
	if [ $# -eq 1 ]; then
        echo "$1"
    else
        local result="$1"
        shift
        ((result *= $(recursive_mul "$@")))
        echo "$result"
    fi
}

function bar {
	# 获取最后一个参数
    if [ $# -gt 0 ]; then
        echo "test result ${!#}"
    fi
}
变量

一般的变量就不多说了

数组

可惜的是,在Shell中不能直接传递数组,也不能直接返回数组,需要分解成多个参数

function double {
    local arr
    arr=($@) # 获取
    for ((i = $(($# - 1)); i >= 0; --i)); do
        ((arr[i] *= 2))
    done
    echo "${arr[*]}" # 返回
}

var=(1 2 3 4)
arr=($(double ${var[*]}))
echo ${arr[*]}

局部变量和全局变量

全局变量有着种种不便之处(诸如使用了无效的全局变量、意料之外的赋值等),不仅Shell,其他语言中也推荐尽量使用局部变量

默认情况下,在脚本中、函数中定义的变量都是全局变量

在函数中定义变量时可以使用local关键字定义局部变量

返回值

获取函数返回值的方式有两种

  1. 使用return$?
  2. 使用echo$()(当然也可以用``,但不推荐)。

二者并不对立,可以配合使用。严格意义上说,第二种方法不是返回值,而是捕获输出。

return
function foo {
	echo 'test result'
	return 1
}

如果没有指定return一个值,那么就返回函数中最后一个命令的返回值(函数体不能为空,别想没有命令会怎么样了)。

与C语言等不同,return的值不能直接获取,而是通过$?查看。跟其他命令一样,返回值同样应该是一个0~255的状态码。

因为if, while, until等命令是通过$?来判断的,因此返回值可以直接用于这些流程中。但记住,如果不使用这些但又想获取返回值,请在函数结束后立刻查看$?,否则它会被其他命令的返回值覆盖。

if foo; then
	echo "yes"
else
	echo "no"
fi
echo

return返回的状态码相比,不如说echo$()更像C语言中的返回值,可以返回字符串、整数、浮点数等,因为它是通过捕获echo的输出并保持到一个变量中来实现的。

result=$(foo)
# now result is "test result"
在其他地方使用函数

加载脚本文件到环境,可以使用source命令,可以在命令行中使用,也可以在其他脚本文件中使用

source <script file>
# 就可以使用<script file>中的命令了

每次Shell启动时都会加载~/.bashrc,可以在里面定义函数或是用source加载脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值