VERSION="4.0beta12"
NEXT_VERSION=?????
自動リリーススクリプトを作成しながら、現在のバージョンを$ VERSION変数に保存し、次のバージョンを$ NEXT_VERSIONとして計算しようとしています。
ルール:文字列の終わりの整数を増やします。
4.0ベータ12→4.0ベータ13
4.2アルファ9→4.2アルファ10
sed/awk/evalを試しましたが、正しく機能しません。アイデアはありますか?どんなツールでも可能です。
答え1
Bash以外には何も必要ありません。
for version in 12.4alpha9 12.4alpha12 12.4alpha-2; do
echo -n "$version => ";
[[ "$version" =~ (.*[^0-9])([0-9]+)$ ]] && version="${BASH_REMATCH[1]}$((${BASH_REMATCH[2]} + 1))";
echo "$version";
done
あなたと実際に関連する唯一の行は、正規表現チェックを含む行です[[
。この行は、最後の数字まで続くすべてを記憶し、それを再利用し、次の数字を追加します。
答え2
常に合理的に整理された規則があると仮定すると(バージョンには常に数字がなく、バージョンは常に数字で終わります)、扱いにくいですが、これが開始かもしれません。
#!/usr/bin/gawk -f
1 {
pfx = gensub(/^(.*[^0-9])([0-9]+)$/, "\\1", "")
patchlevel = gensub(/^(.*[^0-9])([0-9]+)$/, "\\2", "")
new_pl = (1*patchlevel)+1
printf "%s%s\n", pfx, new_pl
}
テスト:
[0 1066] ~/temp % echo "12.4alpha9" | gawk -f incvers.awk
12.4alpha10
[0 1067] ~/temp % echo "12.4alpha12" | gawk -f incvers.awk
12.4alpha13
[0 1068] ~/temp % echo "12.4alpha-2" | gawk -f incvers.awk
12.4alpha-3
答え3
持ってみよう
MAJOR=4
MINOR=0
STATE="beta"
POINT=9
VERSION=$MAJOR.$MINOR$STATE$POINT
NEXT_VERSION=$MAJOR.$MINOR$STATE$((POINT +1 ))
echo "Next version is $NEXT_VERSION"
# other release stuff here
これが独自の書き換えスクリプトになりたいですか?次のようなことを提案します。
tempfile=$( tempfile -d . )
sed -re "s/POINT=[0-9]+/POINT=$(( ++POINT ))/" $0 > $tempfile
chmod +x $tempfile
mv $tempfile $0
答え4
これは、末尾の数字に1を加える移植可能なシェルの断片です$current_version
。
n=${current_version##*[!0-9]}; p=${current_version%%$n}
next_version=$p$((n+1))
単純だからといって(とても簡単だ)良いアイデアという意味ではありません。良いアンドリュー、変数定義をコンポーネントに分割することをお勧めします。