次のシェルコマンドがあり、TEST_02
出力として印刷されていることを確認したいと思います。
myVer=TEST_03
n=${myVer##*[!0-9]}; p=${myVer%%$n}
lastver=$p$((n-1))
echo $lastver
誰かが私が意図したことを達成するために正しいスクリプトを提案できる場合は、出力が提供され、TEST_2
テストビルドに従う必要があるトラックがありません。TEST_02
私は変更しようとしました
n=${myVer##*[!0-9]}
到着
n=${myVer##*[!1-9]},
この場合、値があると正しく機能しませんTEST_10/TEST_20/TEST_30
。
答え1
0
$((..))
算術コンテキストを計算すると、数字を10進数に変換すると先行が削除されるためです。0
次を使用して前にゼロを追加してprintf()
行間を維持する1つの方法
num=${myVer##*[!0-9]}
p=${myVer%%$num}
numLen=${#num}
printf()
次に、この長さを使用して前にゼロを追加するように呼び出します。
printf -v leadzero "%0*d" "$numLen" "$((10#$num-1))"
lastver="$p$leadzero"
printf '%s\n' "$lastver"
10#$
8進形式の数字を処理するために、前にプレフィックスを追加できますnum-1
。