Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash迭代版本列表(字符串),只允许升级_Bash_Shell_For Loop_Syntax - Fatal编程技术网

bash迭代版本列表(字符串),只允许升级

bash迭代版本列表(字符串),只允许升级,bash,shell,for-loop,syntax,Bash,Shell,For Loop,Syntax,我正在编写自定义bash脚本,该脚本将运行一系列命令,从而在更新web应用程序时进行更新 所以我有一个版本列表(我的bash代码的简短剪辑): declare-a版本=(“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.2”“1.4.3”“1.4.4”“1.5.0-beta.1”“1.5.2”) echo“请输入当前版本” 阅读版本 echo“请输入要升级的版本” 读取更新版

我正在编写自定义bash脚本,该脚本将运行一系列命令,从而在更新web应用程序时进行更新

所以我有一个版本列表(我的bash代码的简短剪辑):

declare-a版本=(“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.2”“1.4.3”“1.4.4”“1.5.0-beta.1”“1.5.2”)
echo“请输入当前版本”
阅读版本
echo“请输入要升级的版本”
读取更新版本
中的大小写“$updateVersion”
1.5.2)
用于“${Versions[@]}”中的val;做
#不确定如何处理版本比较。基本上,版本将按顺序添加到$Versions数组中。数组中的索引越高,升级版本就越高。
如果[“$val”==“$updateVersion”];然后
echo“从$updateVersion更新到$val的版本”
其他的
#不确定这是否真的需要
回声“”
fi
echo$val
完成
echo“将HumHub从$version更新为$updateVersion”
;;         
*)
echo$“用法:$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 | 1.4.1 | 1.4.2 | 1.4.3 | 1.5.0-beta.1 1245.2”
出口1
以撒
如果我指定:
$version=1.3.17
$version=1.5.2
,如何允许只进行升级

case "$updateVersion" in
        1.5.2|1.3.17)
            for ...
       ;;

我认为您可以像上面那样处理多值。

没有内置版本比较,也不处理非数字版本(而且它有太多循环),因此我在这里编写了
version\u can\u 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

你能提供一个你期望失败的输入示例和一个你期望成功的输入示例吗?@root如果我输入:当前版本
1.3.17
和更新版本
1.5.2
,那么首先我想要所有版本的输出(代码)1.3.17.1.3.17.1.3.3.18.1.3.20.1.1.4.0.1.4.0-beta.1.1.4.4.0.1.4.0.1.4.0.1.4.0.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.4.4.4.0-beta.1.1.1.1.1.1.1.4.4.4.4.0.0.4.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.0.1.1.0.1.4.4.0.0.0.0.0.0.4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.4.2,1.4.3,1.4.4,1.5.0-beta.1,1.5.0,1.5.1,1.5.2)。更新版本基本上不能低于当前版本。您要查找的语法是
1.5.2 | 1.3.17)for…
@hendry:不确定如何处理for循环。
是什么意思?谢谢,看起来很漂亮!再想想。我发现了一种直接从github获取新版本的新方法,然后我将使用
versions=${new\u VERSION:-$(curl-s)https://api.github.com/repos/humhub/humhub/releases |jq-r'.[]|.name')}
。在你的方法中应该如何使用它?我想提到的是,有与我提到的相同的版本,但是是静态的。您可以使用命令的输出填充bash数组,如下所示:
declare-r versions=($(curl…| jq…)
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