基本上,我需要创建一个传递参数的函数,并且需要更新数字,例如,参数将是
version_2,并在功能之后将其更改为version_3
仅增加一个
在Java中,我将创建一个新字符串,并抓住最后一个字符更新,然后追加,但不确定如何在bash中执行。
updateVersion() {
version=$1
}
前缀可以是任何东西,例如,可以是dog12或dog_12,并且总是有一个要更新的数字。
更新后,分别为dog13或dog_13。
答案 0 :(得分:2)
updateVersion()
{
[[ $1 =~ ([^0-9]*)([0-9]+) ]] || { echo 'invalid input'; exit; }
echo "${BASH_REMATCH[1]}$(( ${BASH_REMATCH[2]} + 1 ))"
}
# Usage
updateVersion version_11 # output: version_12
updateVersion version11 # output: version12
updateVersion something_else123 # output: something_else124
updateVersion "with spaces 99" # output: with spaces 100
# Putting it in a variable
v2="$(updateVersion version2)"
echo "$v2" # output: version3
答案 1 :(得分:2)
incrementTrailingNumber() {
local prefix number
if [[ $1 =~ ^(.*[^[:digit:]])([[:digit:]]+)$ ]]; then
prefix=${BASH_REMATCH[1]}
number=${BASH_REMATCH[2]}
printf '%s%s\n' "$prefix" "$(( number + 1 ))"
else
printf '%s\n' "$1"
fi
}
用法:
$ incrementTrailingNumber version_30
version_31
$ incrementTrailingNumber foo-2.15
foo-2.16
$ incrementTrailingNumber noNumberHereAtAll # demonstrate noop case
noNumberHereAtAll
答案 2 :(得分:2)
使用参数扩展:
#! /bin/bash
shopt -s extglob
for version in version_1 version_19 version_34.14 ; do
echo $version
v=${version##*[^0-9]}
((++v))
echo ${version%%+([0-9])}$v
done
extglob
构造需要 +([0-9])
,意思是“一个或多个数字”。
答案 3 :(得分:0)
在这里晚了聚会,但是接受的答案有问题。它适用于OP在结尾之前没有数字的情况,但是我有一个这样的示例:
1.0.143
为此,正则表达式需要稍微宽松一些。这是我的做法,保留了前导零:
#!/usr/bin/env bash
updateVersion()
{
[[ ${1} =~ ^(.*[^0-9])?([0-9]+)$ ]] && \
[[ ${#BASH_REMATCH[1]} -gt 0 ]] && \
printf "%s%0${#BASH_REMATCH[2]}d" "${BASH_REMATCH[1]}" "$((10#${BASH_REMATCH[2]} + 1 ))" || \
printf "%0${#BASH_REMATCH[2]}d" "$((10#${BASH_REMATCH[2]} + 1))" || \
printf "${1}"
}
# Usage
updateVersion 09 # output 10
updateVersion 1.0.450 # output 1.0.451
updateVersion version_01 # output version_02
updateVersion version12 # output version13
updateVersion version19 # output version20
注意:
printf
的第一个参数加双引号即可。${1}
中的内容替换""
,
而不是在函数中。printf
切换为基本echo
。如果您只是打印到stdout
或stderr
,请考虑在每个\n
的末尾添加换行符(printf
)。\
)和else(&&
)处将其与||
对齐。函数的作用-逐行: