자체 업데이트 bash 스크립트, 업데이트가 있으면 먼저 Git을 계속 사용하세요.

자체 업데이트 bash 스크립트, 업데이트가 있으면 먼저 Git을 계속 사용하세요.

나에게 맞는 능력을 추가해보려고 해요ArchLinux 설치 프로그램 스크립트gitlab의 버전 번호와 일치하는(또는 일치하지 않는) 기반이 아닌 최신 버전인지 확인하세요. 설치 프로그램(및 번호가 매겨진 모든 스크립트 파일)을 실행하는 기본 스크립트 aalis.sh는 기본적으로 다른 파일도 함께 실행하는 스크립트입니다 . 버전 번호는 1.2.3(major.minor.patch)와 같습니다.

기본적으로 스크립트를 변경할 때마다 스크립트의 gitlab 버전 번호를 변경합니다. 스크립트 자체에서 해당 버전 번호가 github의 버전 번호와 일치하지 않는 것을 감지하기를 원합니다. 이를 실행하려는 스크립트 및 사례) 자동으로 업데이트된 git fetch origin master다음 업데이트된 콘텐츠로 다시 실행됩니다.

답변1

스크립트를 업데이트하기 전에 모든 것을 함수 안에 넣으세요. 이렇게 하면 스크립트 내용이 교체되기 전에 모든 코드가 로드됩니다.

function some_function {
    ...
}

function main {
    ...
}

main "$@"

버전을 다른 파일(예 version.sh: .

답변2

나는 그것을 생각했다! 나는 이것을 찾았다온라인 스크립트 저장소에서 파일에 대한 답변 검색2.4.0, 컬 명령을 사용하고 URL을 변경하여 VERSION.txt 파일을 검색하세요( 예 를 들어 파일에는 버전 번호만 포함되어 있습니다.실제 버전 비교 기능에 대한 답변. 두 답변을 병합하고 스크립트의 출력을 변경한 후 test_compare_versions결과는 다음과 같습니다.

# Answer from https://stackoverflow.com/a/49351294/17812185 by Maxxim
# Compare two version strings [$1: version string 1 (v1), $2: version string 2 (v2)]
# Return values:
#   0: v1 == v2
#   1: v1 > v2
#   2: v1 < v2
# Based on: https://stackoverflow.com/a/4025065 by Dennis Williamson
function compare_versions() {

    # Trivial v1 == v2 test based on string comparison
    [[ "$1" == "$2" ]] && return 0

    # Local variables
    local regex="^(.*)-r([0-9]*)$" va1=() vr1=0 va2=() vr2=0 len i IFS="."

    # Split version strings into arrays, extract trailing revisions
    if [[ "$1" =~ ${regex} ]]; then
        va1=(${BASH_REMATCH[1]})
        [[ -n "${BASH_REMATCH[2]}" ]] && vr1=${BASH_REMATCH[2]}
    else
        va1=($1)
    fi
    if [[ "$2" =~ ${regex} ]]; then
        va2=(${BASH_REMATCH[1]})
        [[ -n "${BASH_REMATCH[2]}" ]] && vr2=${BASH_REMATCH[2]}
    else
        va2=($2)
    fi

    # Bring va1 and va2 to same length by filling empty fields with zeros
    (( ${#va1[@]} > ${#va2[@]} )) && len=${#va1[@]} || len=${#va2[@]}
    for ((i=0; i < len; ++i)); do
        [[ -z "${va1[i]}" ]] && va1[i]="0"
        [[ -z "${va2[i]}" ]] && va2[i]="0"
    done

    # Append revisions, increment length
    va1+=($vr1)
    va2+=($vr2)
    len=$((len+1))

    # *** DEBUG ***
    echo "TEST: '${va1[@]} (?) ${va2[@]}'"

    # Compare version elements, check if v1 > v2 or v1 < v2
    for ((i=0; i < len; ++i)); do
        if (( 10#${va1[i]} > 10#${va2[i]} )); then
            return 1
        elif (( 10#${va1[i]} < 10#${va2[i]} )); then
            return 2
        fi
    done

    # All elements are equal, thus v1 == v2
    return 0
}

# Test compare_versions [$1: version string 1, $2: version string 2, $3: expected result]
function test_compare_versions() {
    compare_versions "$1" "$2"
    case $? in
        0) op="==" ;;
        1) op=">" ;;
        2) op="<" ;;
    esac

    if [[ "$op" == "==" ]]; then
        output ${LIGHT_GREEN} "The script is update to date!"
    elif [[ "$op" == "<" ]]; then
        output ${RED} "The script is out of date!!"
    elif [[ "$op" == ">" ]]; then
        output ${YELLOW} "The script is ahead of the release version, so this must be a release canidate or a beta build!"
    else
        banner ${RED} "SOMETHING HAS GONE WRONG, PLEASE REPORT THIS ERROR TO THE PROJECT'S GITLAB"
    fi

}


VERSION=1.2.0
ONLINE_VERSION=$(curl -s https://gitlab.com/NovaViper/testing-for-aalis-version-checker/-/raw/main/VERSION.txt)
test_compare_versions $VERSION $ONLINE_VERSION

관련 정보