bash перебирать список версий (строку) и разрешать только обновление - PullRequest
0 голосов
/ 26 мая 2020

Я работаю над настраиваемым bash скриптом, который запускал бы набор команд, которые приводили бы к обновлению при обновлении веб-приложения.

Итак, у меня был бы список версий (короткий фрагмент моего bash код):

declare -a Versions=("1.3.17" "1.3.18" "1.3.19" "1.3.20" "1.4.0-beta.1" "1.4.0-beta.1" "1.4.0-beta.2" "1.4.0" "1.4.1" "1.4.2" "1.4.3" "1.4.4" "1.5.0-beta.1" "1.5.0" "1.5.1" "1.5.2")

echo "Please enter current version"
read version

echo "Please enter version which you'd like to upgrade"
read updateVersion

case "$updateVersion" in
        1.5.2)
            for val in "${Versions[@]}"; do

                # Not sure how to treat version comparison. Basically the version would be added in order on the $Versions array. Higher index in array would mean higher version to upgrade.
                if [ "$val" == "$updateVersion" ]; then
                    echo "Update to version from $updateVersion to $val"
                else
                    # Not sure if this is really needed
                    echo ""
                fi

              echo $val
            done
            echo "Updating HumHub from $version to $updateVersion"
            ;;         
        *)
            echo $"Usage: $0 {1.3.17|1.3.18|1.3.19|1.3.20|1.4.0-beta.1|1.4.0-beta.1|1.4.0-beta.2|1.4.0|1.4.1|1.4.2|1.4.3|1.4.4|1.5.0-beta.1|1.5.0|1.5.1|1.5.2}"
            exit 1
esac

Как разрешить, чтобы происходило только обновление, если я укажу: $version=1.3.17 и $version=1.5.2?

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Нет встроенного сравнения версий, и этот ответ не касается нечисловых c версий (и в нем слишком много циклов), поэтому я написал здесь version_can_update():

declare -r VERSIONS=(
    "1.3.17"
    "1.3.18"
    "1.3.19"
    "1.3.20"
    "1.4.0-beta.1"
    "1.4.0-beta.1"
    "1.4.0-beta.2"
    "1.4.0"
    "1.4.1"
    "1.4.2"
    "1.4.3"
    "1.4.4"
    "1.5.0-beta.1"
    "1.5.0"
    "1.5.1"
    "1.5.2"
)

get_comonent()
{
    local -r STR="$1"
    local -r INDEX="$2"

    # ugly, but gets the job done
    local -r ARRAY=( ${STR//./ } ) # replace dots with spaces, and ask the shell to put each space-separated string in a separate array element
    echo ${ARRAY[INDEX]}
}

version_can_update()
{
    local -r FROM="$1"
    local -r TO="$2"

    local FROM_COMPONENT
    local TO_COMPONENT

    local INDEX=0
    while true; do
        FROM_COMPONENT=$(get_comonent "$FROM" "$INDEX")
        TO_COMPONENT=$(get_comonent "$TO" "$INDEX")

        if [ -z "$FROM_COMPONENT" ]; then
            # e.g. 1.3 and 1.3.1
            return 0
        elif [ -z "$TO_COMPONENT" ]; then
            # e.g. 1.3.1 and 1.3
            return 1
        elif [[ "$FROM_COMPONENT" < "$TO_COMPONENT" ]]; then
            # e.g. 1.3.8 and 1.4.2, second component matters
            return 0
        elif [[ "$FROM_COMPONENT" > "$TO_COMPONENT" ]]; then
            # e.g. 1.4.2 and 1.3.8, second component matters
            return 1
        else
            # for something like 1.3.2.8 and 1.3.2.9, we loop until we hit a difference
            ((INDEX++))
        fi
    done
}

can_update()
{
    local -r LOWER="$1"
    local -r PROPOSED="$2"
    local -r UPPER="$3"
    if [ "$LOWER" = "$PROPOSED" ] || [ "$PROPOSED" = "$UPPER" ]; then
        return 0
    fi
    if version_can_update "$LOWER" "$PROPOSED" && version_can_update "$PROPOSED" "$UPPER"; then
        return 0
    fi
    return 1
}

echo "Please enter current version"
read CURRENT_VERSION

echo "Please enter version which you'd like to upgrade"
read UPDATE_VERSION

if [ -z "$CURRENT_VERSION" ] || [ -z "$UPDATE_VERSION" ]; then
    declare -r ALL_VERSIONS="${VERSIONS[*]}" # all versions in a single whitespace-separated string
    echo "Usage: $0 {${ALL_VERSIONS// /|}}" # replace all spaces with vertical bars
    exit 1
fi

echo
for ((i=0; i < ${#VERSIONS[@]}; i++)); do
    if can_update "$CURRENT_VERSION" "${VERSIONS[i]}" "$UPDATE_VERSION"; then
        echo "${VERSIONS[i]}"
    fi
done

Пример вывода:

Please enter current version
1.4.0-beta.1
Please enter version which you'd like to upgrade
1.5.0

1.4.0-beta.1
1.4.0-beta.1
1.4.0-beta.2
1.4.1
1.4.2
1.4.3
1.4.4
1.5.0
0 голосов
/ 26 мая 2020
case "$updateVersion" in
        1.5.2|1.3.17)
            for ...
       ;;

Я думаю, вы можете обрабатывать многозначные значения, как указано выше.

...