linux - 简化语义版本控制脚本

标签 linux bash shell

我对应用程序组件进行了语义版本控制,这就是我更新主版本号并将其存储回 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 , secondthird ;值得注意的是,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/

相关文章:

python - 使用cmd将文件从windows传输到linux服务器

java - 如何在linux服务器上通过java程序查看oracle监听器状态

linux - Fedora bash 命令错误

linux - shell/linux 脚本仅选择某些文件到 FTP

linux - 如何在 shell 脚本中等待模块加载完成?

bash - 从 bash 脚本更改用户

linux - Bash - if 语句不会自动运行

linux - 如何更改 Linux 终端中命令的功能?

bash - 如何将 shell 命令应用于命令输出的每一行?

linux - 在脚本中启动 shell