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

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

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

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'

おすすめ記事