如何创建一个主 bash 脚本,允许用户输入他们想要运行的两个函数中的哪一个?

如何创建一个主 bash 脚本,允许用户输入他们想要运行的两个函数中的哪一个?

我目前有两个 bash 函数,一个用于上传,另一个用于下载文件。我想创建一个 bash 脚本,允许用户指定他们想要执行的两个操作中的哪一个。

我遇到的问题是上传和下载功能无论如何都会运行。例如:

function upload() {
    var=$1
    #something goes here for upload
}

function download() {
    var=$1
    #something here for download
}

main() {
        case "$1" in
            -d) download "$2";;
            -u) upload "$2";;
            *) "Either -d or -x needs to be selected"
        esac
}

我无法让 main() 仅运行并抑制downloadandupload直到需要为止。

答案1

您还需要调用该main函数,并将脚本的命令行参数传递给它:

#!/bin/sh

upload() {
    echo "upload called with arg $1"
}
download() {
    echo "download called with arg $1"
}

main() {
    case "$1" in
        -d) download "$2";;
        -u) upload "$2";;
        *) echo "Either -d or -u needs to be selected"; exit 1;;
    esac
}

main "$@"

function foo这里不需要 ksh 风格的声明,foo()而是使用它,因为它是标准的并且得到更广泛的支持。

答案2

您可以考虑使用getopts选项解析,并要求用户选择一个函数(如果该选项不存在):

usage() {
    echo "usage: $0 ..." >&2
    exit $1
}

main() {
    local func opt

    while getopts 'hdu' opt; do
        case $opt in
            h) usage 0 ;;
            d) func=download ;;
            u) func=upload ;;
            *) usage 1 ;;
        esac
    done
    shift $((OPTIND - 1))

    [[ $# -eq 0 ]] && usage 1

    # get the user to select upload or download
    if [[ -z $func ]]; then
        PS3='Choose a function: '
        select func in upload download; do
            [[ -n $func ]] && break
        done
    fi

    # now, invoke the function with the argument
    "$func" "$1"
}

main "$@"

相关内容