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)
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)
我知道这不是最短的方式,但对我而言,最简单的理解和阅读......
还有另一种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)
我使用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=.-
来分割.
或-
.)
Awk使其非常简单:
echo "1.2.14" | awk -F \. {'print $1,$2, $3'}
将打印出1 2 14。
标志-F指定分隔符。
如果要保存以下值之一:
firstVariable=$(echo "1.2.14" | awk -F \. {'print $1'})