我有以下 shell 命令并希望确保将其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()
添加前导零来保留前导的方法
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#$
在前面添加前缀num-1
来处理八进制格式的数字。