bash脚本的优雅写法

这种写法可以实现执行执行脚本中的函数

bash demo.sh demo 1 2 '3 4'
./demo.sh demo 1 2 '3 4'

也支持

source demo.sh
demo 7 8 '9 10'
# 严谨的执行方式
set -o nounset -o xtrace -o errexit -o pipefail

# 函数定义
demo() {
    # 获取当前的执行函数
    # 尽量使用局部变量
    local function_name=${FUNCNAME[0]}

    echo function_name=$function_name
    echo params_count=$#
    echo params="$@"
    echo
    echo $function_name "$@"
}

if [[ ${BASH_SOURCE[0]} == $0 ]]; then
    # bash demo.sh demo 1 2 '3 4'
    function=$1
    shift
    $function "$@"
else
    # source执行方式
    :
fi