私は与えられたバージョン番号をインクリメントするbashスクリプトを書こうとしています
{major}.{minor}.{revision}
例えば。
1.2.13
{revision}番号をインクリメントして完全なバージョン番号文字列を出力できるように、sedやawkなどを使用してこれらの3つの番号を簡単に抽出する良い方法はありますか?.
_$ 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%.*}
_${v##*.}
_最初の部分はそのまま印刷され、その後にプレーンドットが続き、最後の部分はシェル算術展開を使用してインクリメントされます。$((x+1))
配列を使用した純粋な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
私はこの種のもののために「カット」コマンドを好む
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"
私はこれが最短の方法ではないことを知っていますが、私にとってそれを理解して読むことは最も簡単です...
さらに別のシェルの方法(この方法でバグを回避する方法は常に複数あることを示しています...):
$ 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
私はシェル自身のワード分割を使用しています。何かのようなもの
oIFS="$IFS"
IFS=.
set -- $version
IFS="$oIFS"
ただし、アルファベットまたは日付のサフィックス、およびその他の厄介な一貫性のないビットのため、一般にバージョン番号に注意する必要があります。この後、位置パラメータは$version
のコンポーネントに設定されます:
$1 = 1
$2 = 2
$3 = 13
($IFS
は文字列ではなく単一文字のセットであるため、IFS=.-
を使用して.
または-
。)
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'})
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
組み込み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"