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

时间:2015-07-09 21:29:05

标签: bash command-line semantic-versioning

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

具体地:
1.排序,和 2.递增一个给定的semver值的主要,次要,补丁。

1 个答案:

答案 0 :(得分:2)

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

文件

10.4.3
11.5
124.4.5
12

您可以使用空间填充重新打印

$ 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=$1
  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