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

时间:2011-06-05 19:25:41

标签: bash shell scripting sed

我正在尝试编写一个bash脚本,该脚本会增加

中给出的版本号
{major}.{minor}.{revision}

例如。

1.2.13

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

8 个答案:

答案 0 :(得分:47)

$ v=1.2.13
$ echo "${v%.*}.$((${v##*.}+1))"
1.2.14

$ v=11.1.2.3.0
$ echo "${v%.*}.$((${v##*.}+1))"
11.1.2.3.1

以下是它的工作原理:

字符串分为两部分。

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

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

答案 1 :(得分:31)

使用数组的纯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

答案 2 :(得分:15)

我喜欢这种事情的“剪切”命令

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"

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

答案 3 :(得分:7)

又一种贝壳方式(显示总有不止一种方法可以解决这些问题......):

$ echo 1.2.3 | ( IFS=".$IFS" ; read a b c && echo $a.$b.$((c + 1)) )
1.2.4

所以,我们可以这样做:

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

答案 4 :(得分:6)

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

之类的东西
oIFS="$IFS"
IFS=.
set -- $version
IFS="$oIFS"

虽然由于字母或日期后缀以及其他恼人的不一致位,您需要小心版本号。在此之后,位置参数将设置为$version

的组件
$1 = 1
$2 = 2
$3 = 13

$IFS是一组单个字符,而不是字符串,因此这不适用于多字符字段分隔符,但您可以使用IFS=.-拆分.-。)

答案 5 :(得分:4)

Awk非常简单:

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

flag -F指定分隔符。

如果您想保存其中一个值:

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

答案 6 :(得分:1)

受到jlliagre答案的启发,我制作了自己的版本,支持版本号只有一个主要版本。 jlliagre的版本将使1 - > 1.2而不是2.

这个版本适用于两种版本号:

function increment_version()
    local VERSION="$1"

    local INCREMENTED_VERSION=
    if [[ "$VERSION" =~ .*\..* ]]; then
        INCREMENTED_VERSION="${VERSION%.*}.$((${VERSION##*.}+1))"
    else
        INCREMENTED_VERSION="$((${VERSION##*.}+1))"
    fi

    echo "$INCREMENTED_VERSION"
}

这将产生以下输出:

increment_version 1         -> 2 
increment_version 1.2       -> 1.3    
increment_version 1.2.9     -> 1.2.10 
increment_version 1.2.9.101 -> 1.2.9.102

答案 7 :(得分:0)

fgm解决方案的小变化使用内置read命令将字符串拆分为数组。请注意,IFS变量的范围仅限于read命令(因此无需存储和恢复当前的IFS变量)。

version='1.2.33'
IFS='.' read -r -a a <<<"$version"
((a[2]++))
printf '%s\n' "${a[@]}" | nl
version="${a[0]}.${a[1]}.${a[2]}"
echo "$version"

请参阅:How do I split a string on a delimiter in Bash?