如何在 posix 环境中操作 semver 值?

How can I manipulate semver values in a posix environment?

我需要一种相当便携的方法来在 posix 环境中操作 semver 值。

具体来说:
1.排序,and
2. 递增以下之一:给定 semver 值的主要、次要、补丁。

如果你有 bash,我想你可以将 semver 值读入数组:

文件

10.4.3
11.5
124.4.5
12

您可以使用 space 填充重新打印它们

$ deSemverize(){ while read line; do IFS=. read -a fields<<<"$line"; printf "%4d %4d %4d\n" ${fields[@]}; done ; }
$ deSemversize < File
#=>
  10    4    3
  11    5    0
 124    4    5
  12    0    0

并且由于 ' ' < '0',您可以按词法对结果进行排序,就好像您首先按 MAJOR 排序,然后是 MINOR,然后是 PATCH。然后您可以再次将结果打印为 Semver 值:

$ semverize() { while read line; do read -a fields<<<"$line"; printf "%d.%d.%d\n" ${fields[@]}; done; }

$ deSemversize < File | sort | semverize
#=>   10.4.3
      11.5.0
      12.0.0
     124.4.5

至于修改字段,您可以使用 (())$(()) 对数值变量进行标准 bash 运算,例如:

echo "$((fields[0]+1))"

我会使用右对齐遮罩:

semverBump() {
  local mask=
  local dots_in_mask=${mask//[^.]/}
  case "$dots_in_mask" in
   "") mask=..$mask;;
   ".") mask=.$mask;;
  esac

  local maskarray
  IFS=. read -a maskarray<<<"$mask"

  while read line; 
  do IFS=. read -a fields<<<"$line"; 
    for((i=0;i<3;i++))
    do
      ((fields[$i]+=0))
      [[ -z "${maskarray[$i]}" ]] && continue

      if [[ "${maskarray[$i]}" =~ ^[+-].* ]]; then
        ((fields[$i]+=maskarray[$i]))
      else
        ((fields[$i]=maskarray[$i]))
      fi
    done
    printf "%d.%d.%d\n" ${fields[@]}
  done ;
}

例如:

   semverBump +2 < File  #increase all minor by 2
   semverBump 2 < File  #set all minor to two
   semverBump +1.-1.0 < File  #increment major, decrement minor, set  patch to zero