web-dev-qa-db-ja.com

シェルスクリプトのファイルからバージョン番号を抽出する

私は与えられたバージョン番号をインクリメントするbashスクリプトを書こうとしています

{major}.{minor}.{revision}

例えば。

1.2.13

{revision}番号をインクリメントして完全なバージョン番号文字列を出力できるように、sedやawkなどを使用してこれらの3つの番号を簡単に抽出する良い方法はありますか?.

34
Dougnukem
_$ 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
_

以下にその仕組みを示します。

文字列は2つの部分に分かれています。

  • 最初のものには最後のドットと次の文字以外のすべてが含まれています:_${v%.*}_
  • 2番目のものには、最後のドットまでのすべての文字以外のすべてが含まれています:_${v##*.}_

最初の部分はそのまま印刷され、その後にプレーンドットが続き、最後の部分はシェル算術展開を使用してインクリメントされます。$((x+1))

56
jlliagre

配列を使用した純粋な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
35
Fritz G. Mehner

私はこの種のもののために「カット」コマンドを好む

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"

私はこれが最短の方法ではないことを知っていますが、私にとってそれを理解して読むことは最も簡単です...

25
Eedoh

さらに別のシェルの方法(この方法でバグを回避する方法は常に複数あることを示しています...):

$ 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
8
Chris J

私はシェル自身のワード分割を使用しています。何かのようなもの

oIFS="$IFS"
IFS=.
set -- $version
IFS="$oIFS"

ただし、アルファベットまたは日付のサフィックス、およびその他の厄介な一貫性のないビットのため、一般にバージョン番号に注意する必要があります。この後、位置パラメータは$versionのコンポーネントに設定されます:

$1 = 1
$2 = 2
$3 = 13

$IFSは文字列ではなく単一文字のセットであるため、IFS=.-を使用して.または-。)

6
geekosaur

Awkはそれを非常に簡単にします:

_echo "1.2.14" | awk -F \. {'print $1,$2, $3'}_は1 2 14。

フラグ-Fはセパレーターを指定します。

値の1つを保存したい場合:

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

5
bbaja42

jlliagre の回答に触発されて、メジャーバージョンが指定されているバージョン番号のみをサポートする独自のバージョンを作成しました。 jlliagreのバージョンは2ではなく1-> 1.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
1
Sven Driemecker

組み込みreadコマンドを使用して文字列を配列に分割するfgmのソリューションの小さなバリエーション。 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"

参照: Bashの区切り文字で文字列を分割するにはどうすればよいですか?

0
tylo