使用截断和替换中缺少 0 的脚本进行字符串操作

使用截断和替换中缺少 0 的脚本进行字符串操作

我有以下 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来处理八进制格式的数字。

相关内容