我对应用程序组件进行了语义版本控制,这就是我更新主要版本号然后将其存储回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)"
答案 0 :(得分:2)
&#34;简单&#34;和&#34;短&#34;不是一回事。 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
读取第一行输入,并将其.
分成shell变量first
,second
和third
;值得注意的是,此示例中的third
列包含前两个后的所有内容,因此,如果您有a.b.c.d.e.f
,则会获得first=a; second=b; third=d.e.f
- 因此名称{ {1}}明确这一点。有关详细说明,请参阅BashFAQ #1。rest
在所有符合POSIX的shell中创建算术上下文。它仅对整数数学很有用,但由于我们用$(( ... ))
分割出这些部分,我们只需需要整数数学。请参阅http://wiki.bash-hackers.org/syntax/arith_expr read
并重命名该写入是否成功,可防止version.txt.$$
在打开和写入之间发生故障时保持空白或损坏。 (担心符号链接攻击的版本会使用version.txt
,而不是依赖mktemp
来生成唯一的临时文件名。)$$
成功或read
为真时才继续执行写操作会阻止代码将版本重置为[ -n "$major" ]
(通过向空字符串添加1来计算,算术上下文为0)如果读取失败。