Bash: カスタマイズ機能の改善に役立つ

Bash: カスタマイズ機能の改善に役立つ

私はBashを学んでいて、基本的な機能を書いています。

wsgc () {
    # Wipe the global variable value for `getopts`.
    OPTIND=1;
    echo "git add -A";
    while getopts m:p option;
    do
        case "${option}"
        in
            m)
                COMMIT_MESSAGE=$OPTARG
                if [ "$COMMIT_MESSAGE" ]; then
                    echo "git commit -m \"$COMMIT_MESSAGE.\""
                else
                    echo "A commit message is required."
                    exit
                fi
                ;;
            p)
                echo "git push"
                exit
                ;;
            \?)
                echo "Invalid parameter."
                exit
                ;;
        esac
    done
}

しかし、いくつかの問題で苦労しています。

  1. inは動作しません。引数を省略すると、ifBashがm)介入してセッションから私を追い出すためです。

    git add -A
    -bash: option requires an argument -- m
    Invalid parameter.
    logout
    Saving session...
    ...copying shared history...
    ...saving history...truncating history files...
    ...completed.
    

    [処理完了]

  2. 次を実行した後、wsgc -m "Yo!" -pセッションから追い出されました。

    git add -A
    git commit -m "Yo."
    git push
    logout
    Saving session...
    ...copying shared history...
    ...saving history...truncating history files...
    ...completed.
    

    [処理完了]

どんなアドバイスも本当にありがとうございます。

答え1

m)のifが動作しません。引数を省略すると、Bashが介入してセッションから私を追い出すためです。

後に指定するgetopts m:p optionことは、引数が必要であることを意味します。指定しないとエラーが発生します。:m

実行後:wsgc -m "Yo! -p、セッションから追い出されました。

セッションから追い出されるとはどういう意味ですか?殻が消えたか?その理由は、スクリプトを実行せずにインポートしたからです。

つまり、をgetopt使用することをお勧めしますgetopts

答え2

  • -mオプションが値を取得できない場合は、シェルexitを終了します。
  • -pこのオプションを使用すると、exitシェルで作業します。
  • 無効なオプションを使用すると、exitシェルが終了します。

これらすべてのケースではありreturnません。2exit番目のケースを除くすべての場合にreturn 1エラー信号を送信する必要があります。さらに、エラーメッセージは.redirectを使用して標準エラーストリームにリダイレクトする必要があります>&2

以下は、コマンドラインがシームレスに解析されない限り、何も出力しないいくつかの修正を含む関数バージョンです。

wsgc () {
    local OPTIND=1
    local out=( "git add -A" )

    while getopts 'm:p' opt; do
        case "$opt" in
            m)  out+=( "git commit -m '$OPTARG'" ) ;;
            p)  out+=( 'git push' ) ;;
            *)  return 1 ;;
        esac
    done

    printf '%s\n' "${out[@]}"
}

出力をソートする必要がある場合(コマンドラインの最後の出力が上記の関数を使用している場合は最後の出力のみですgit push)、フラグを使用してください。-pこれもいいえオプションを複数回使用すると、複数のコマンドが出力されます。

wsgc () {
    local OPTIND=1

    local message
    local do_push=0

    while getopts 'm:p' opt; do
        case "$opt" in
            m)  message="$OPTARG" ;;
            p)  do_push=1 ;;
            *)  return 1 ;;
        esac
    done

    local out=( "git add -A" )

    if [[ -n "$message" ]]; then
        out+=( "git commit -m '$message'" )
    fi

    if (( do_push )); then
        out+=( 'git push' )
    fi

    printf '%s\n' "${out[@]}"
}

関数の最後のビットは次のように短縮できます。

local out=( "git add -A" )

[[ -n "$message" ]] && out+=( "git commit -m '$message'" )
(( do_push ))       && out+=( 'git push' )

printf '%s\n' "${out[@]}"

関連情報