我对应用程序组件进行了语义版本控制,这就是我更新主版本号并将其存储回 version.txt 的方式。这似乎是一个简单操作的很多行。有人可以帮我减少这个吗?没有使用 bc
因为我正在使用的 docker python 图像似乎没有该命令。
这是从一个 yml 文件中提取的,version.txt 只包含一个主要和次要的数字。 1.3 例如。下面的代码仅更新主编号 (1) 并将次编号重置为 0。因此,如果我在 1.3 上运行代码,我将得到 2。
- echo $(<version.txt) 1 | awk '{print $1 + $2}' > version.txt
VERSION=$(<version.txt)
VERSION=${VERSION%.*}
echo $VERSION > version.txt
echo "New version = $(<version.txt)"
最佳答案
关于简单
“简单”和“简短”不是一回事。 echo $foo
短于 echo "$foo"
, 但它实际上做了更多的事情:它拆分了 foo
的值除了 IFS
中的字符, 将该拆分的每个结果计算为 glob 表达式,然后重新组合它们。
同样,让您的代码更简单——例如,限制它所经历的过程中的步骤数量——与让它更短完全不同em>.
增加一件,不修改其他的
if IFS=. read -r major rest <version.txt || [ -n "$major" ]; then
echo "$((major + 1)).$rest" >"version.txt.$$" && mv "version.txt.$$" version.txt
else
echo "ERROR: Unable to read version number from version.txt" >&2
exit 1
fi
递增主版本,丢弃其他版本
if IFS=. read -r major rest <version.txt || [ -n "$major" ]; then
echo "$((major + 1))" >"version.txt.$$" && mv "version.txt.$$" "version.txt"
else
echo "ERROR: Unable to read version number from version.txt" >&2
exit 1
fi
理由
以上两者都是 POSIX 兼容的,并且避免依赖任何未内置到 shell 中的功能。
-
IFS=. read -r first second third <input
读取第一行输入,并将其拆分为.
s 进入 shell 变量first
,second
和third
;值得注意的是,third
此示例中的列包括前两个之后的所有内容,因此如果您有a.b.c.d.e.f
,你会得到first=a; second=b; third=d.e.f
-- 因此得名rest
明确这一点。参见 BashFAQ #1以获得详细解释。 -
$(( ... ))
在所有符合 POSIX 的 shell 中创建算术上下文。它仅对整数数学有用,但由于我们用read
拆分了各个部分,我们只需要整数数学。参见 http://wiki.bash-hackers.org/syntax/arith_expr - 写信给
version.txt.$$
如果写入成功则重命名会阻止version.txt
如果在打开和写入之间发生故障,则不会被留空或损坏。 (担心符号链接(symbolic link)攻击的版本会使用mktemp
,而不是依赖$$
来生成唯一的临时文件名称)。 - 仅当
read
时才继续写入成功或[ -n "$major" ]
为真会阻止代码将版本重置为1
(通过将 1 添加到一个空字符串,它在算术上下文中计算为 0)如果读取失败。
关于linux - 简化语义版本控制脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50352998/