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안 되며 exit, 두 번째 경우를 제외한 모든 경우에 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[@]}"

관련 정보