从shell脚本中的文件中提取版本号

Dou*_*kem 31 bash shell scripting sed

我正在尝试编写一个bash脚本,该脚本会增加给出的版本号

{major}.{minor}.{revision}
Run Code Online (Sandbox Code Playgroud)

例如.

1.2.13
Run Code Online (Sandbox Code Playgroud)

是否有一种很好的方法可以使用像sed或awk这样的东西轻松提取这3个数字,这样我就可以增加{revision}数字并输出完整的版本号字符串.

jll*_*gre 50

$ v=1.2.13
$ echo "${v%.*}.$((${v##*.}+1))"
1.2.14
Run Code Online (Sandbox Code Playgroud)
$ v=11.1.2.3.0
$ echo "${v%.*}.$((${v##*.}+1))"
11.1.2.3.1
Run Code Online (Sandbox Code Playgroud)

下面是它的工作原理:

字符串分为两部分.

  • 第一个包含除最后一个点和下一个字符之外的所有字符: ${v%.*}
  • 第二个包含除最后一个点之外的所有字符: ${v##*.}

第一部分按原样打印,后跟一个普通点,最后一部分使用shell算术扩展递增: $((x+1))


Fri*_*ner 33

使用数组的纯Bash:

version='1.2.33'
a=( ${version//./ } )                   # replace points, split into array
((a[2]++))                              # increment revision (or other part)
version="${a[0]}.${a[1]}.${a[2]}"       # compose new version
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个版本,因为它没有假设该版本有多少部分。不过,要编写新版本,必须设置 `IFS` 并使用 `"${a[*]}"`。谢谢,能够很好地利用它! (2认同)

Eed*_*doh 21

我喜欢这种事情的"削减"命令

major=`echo $version | cut -d. -f1`
minor=`echo $version | cut -d. -f2`
revision=`echo $version | cut -d. -f3`
revision=`expr $revision + 1`

echo "$major.$minor.$revision"
Run Code Online (Sandbox Code Playgroud)

我知道这不是最短的方式,但对我而言,最简单的理解和阅读......

  • @fgm 但至少无论您是否使用 bash,它都有效。+1 你当然可以简化这个: echo "$(echo $version | cut -d.-f-2).$(expr $(echo $version | cut -d. -f3) + 1)" 它是仍然有很多子外壳和管道,但除非您使用的是超微功率不足的嵌入式设备,否则这无关紧要。如果您追求速度,那么首先 bash 可能不是最佳选择;-) (3认同)
  • 4个子shell,3个管道,3个完整的进程(至少)只是为了改变一两个字符!这有点太多了。 (2认同)

Chr*_*s J 8

还有另一种shell方式(显示总是有不止一种方法可以解决这些问题......):

$ echo 1.2.3 | ( IFS=".$IFS" ; read a b c && echo $a.$b.$((c + 1)) )
1.2.4
Run Code Online (Sandbox Code Playgroud)

所以,我们可以这样做:

$ x=1.2.3
$ y=`echo $x | ( IFS=".$IFS" ; read a b c && echo $a.$b.$((c + 1)) )`
$ echo $y
1.2.4
Run Code Online (Sandbox Code Playgroud)


gee*_*aur 6

我使用shell自己的单词分裂; 就像是

oIFS="$IFS"
IFS=.
set -- $version
IFS="$oIFS"
Run Code Online (Sandbox Code Playgroud)

虽然由于字母或日期后缀和其他令人讨厌的不一致的位,你需要小心版本号.在此之后,位置参数将被设置为以下组件$version:

$1 = 1
$2 = 2
$3 = 13
Run Code Online (Sandbox Code Playgroud)

($IFS是一组单个字符,而不是字符串,因此这不适用于多字符字段分隔符,尽管您可以使用它IFS=.-来分割.-.)


bba*_*a42 5

Awk使其非常简单:

echo "1.2.14" | awk -F \. {'print $1,$2, $3'} 将打印出1 2 14。

标志-F指定分隔符。

如果要保存以下值之一:

firstVariable=$(echo "1.2.14" | awk -F \. {'print $1'})