異なるパラメータを必要とする関数内でパラメータを持つ関数を呼び出す

異なるパラメータを必要とする関数内でパラメータを持つ関数を呼び出す

言葉でどのように表現すべきかわからないので、最善を尽くして説明します。機能があります。

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サブシェルの外では渡すことはできません。

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
}

サブシェルの目的が何であるかわからないので削除しました。ただし、何らかの理由でサブシェルが必要な場合は、パラメータを入力してください。

( sendFirstEmail "$1" )

Kusalanandaが指摘したように、この特別な例は1つの構成ではなく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
}

Timが提案したように、実際に2番目のパラメータを提供するには、次の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()
{
    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
}

この場合、$arg2inはさまざまなコマンドで内部的にmain()使用されます。$1send*Email

答え3

他の人が言ったことを繰り返す危険があります。たとえば、スクリプトを次のように呼び出すと、次のように呼び出す必要があります。./sendEmail.sh -f [email protected]

主な「1ドル」「2ドル」
main() そして次のように変更します。
基本()
{
        if[["$1"="-f"]]
        それから
                最初のメールを送信「2ドル」
        elif [[“$1”=“-s”]]
        それから
                2番目のメールを送信「2ドル」
        elif [[“$1”=“-k”]]
        それから
                削除メールを送信「2ドル」
        その他
                echo "有効な入力が提供されていません。"
        フィリピン諸島
}
だから第二(最も外側の)スクリプトの引数は2番目の引数になりmain()、次に最も内側の関数の(唯一の)引数になります。

私に変わった$(function_name)function_name なぜなら、それはうまくいかないと言ったからです。$(function_name)

関連情報