在需要另一个参数的函数内部调用带有参数的函数

在需要另一个参数的函数内部调用带有参数的函数

我不知道还能用什么语言来表达,所以我会尽力解释。我有一个函数

main()
{

        if [[ "$1" = "-f" ]]
        then
                ($sendFirstEmail) "$1"

        elif [[ "$1" = "-s" ]]
        then
                ($sendSecondEmail) "$1"

        elif [[ "$1" = "-k" ]]
        then
                ($sendKillEmail) "$1"
        else
                echo "valid input not provided"
        fi
}

我这样称呼main "$1"我需要做的是将另一个参数传递给主函数内的其他函数,该函数也接受传递给它的第一个参数。 $sendFirstEmail 等是其他函数的名称,它们也接受传递给它们的第一个参数。本质上,这就是我想要调用脚本的方式这可能吗?或者是否有更好的方法来实现我想要做的事情?./sendEmail.sh -f [email protected]

答案1

您可以将位置参数传递给它们,就像您所做的那样,main但不能在子 shell 之外传递。

main()
{
    if [[ "$1" == "-f" ]]
    then
        sendFirstEmail "$1"

    elif [[ "$1" == "-s" ]]
    then
        sendSecondEmail "$1"

    elif [[ "$1" == "-k" ]]
    then
        sendKillEmail "$1"
    else
        echo "valid input not provided"
    fi
}

我不确定子 shell 的用途是什么,因此我已将其删除,但如果您确实出于某种原因确实需要子 shell,只需将参数放入其中即可:

( sendFirstEmail "$1" )

正如 Kusalananda 指出的,这个特定的例子更适合一个case构造而不是一个if(参见3.2.4.2 条件构造

main()
{
    case $1 in
        -f) sendFirstEmail "$1";;
        -s) sendSecondEmail "$1";;
        -k) sendKillEmail "$1";;
        *)  echo "valid input not provided" >&2;;
    esac
}

或者更好的是,getopts

main()
{
    if getopts fsk opt; then
        case $opt in
            f)  sendFirstEmail "$1";;
            s)  sendSecondEmail "$1";;
            k)  sendKillEmail "$1";;
            *)  echo "valid input not provided" >&2;;
        esac
    fi
}

如果您实际上想提供第二个参数,正如蒂姆建议的那样,您可以使用该getopts optarg功能:

main()
{
    if getopts f:s:k: opt; then
        case $opt in
            f)  sendFirstEmail "$OPTARG";;
            s)  sendSecondEmail "$OPTARG";;
            k)  sendKillEmail "$OPTARG";;
            *)  echo "valid input not provided" >&2;;
        esac
    fi
}

在这种情况下,你会main像这样运行:

main -f 'option to the -f argument'

答案2

您可以将 2 个参数传递给您的 main 函数吗?

main()
{
    arg1=$1
    arg2=$2

    if [[ "$arg1" = "-f" ]]
    then
            ($sendFirstEmail "$arg2")

    elif [[ "$arg1" = "-s" ]]
    then
            ($sendSecondEmail "$arg2")

    elif [[ "$arg1" = "-k" ]]
    then
            ($sendKillEmail "$arg2")
    else
            echo "valid input not provided"
    fi
}

在这种情况下,$arg2inmain()就成为$1各种send*Email命令的内部。

答案3

冒着重复别人说过的话的风险:如果,正如你所说,你将脚本调用为(例如)  ,那么你必须调用./sendEmail.sh -f [email protected]

主要“1美元”“2美元”
并更改main() 如下:
主要的()
{
        如果[[“$1”=“-f”]]
        然后
                发送第一封电子邮件“2美元”
        elif [[“$1”=“-s”]]
        然后
                发送第二封邮件“2美元”
        elif [[“$1”=“-k”]]
        然后
                发送删除邮件“2美元”
        别的
                echo“未提供有效输入”
}
所以第二(最外层)脚本的参数成为 的第二个参数main(),随后成为最内层函数的(唯一的)参数。

我已经 改为$(function_name)function_name 因为你说那不起作用。$(function_name)

相关内容