bash迭代版本列表(字符串),只允许升级
我正在编写自定义bash脚本,该脚本将运行一系列命令,从而在更新web应用程序时进行更新 所以我有一个版本列表(我的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“请输入要升级的版本” 读取更新版
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