向用户输入添加前导零,但正在使用 printf 进行转换

向用户输入添加前导零,但正在使用 printf 进行转换

我目前正在寻找以下代码的替代方案,该代码的工作原理稍微不那么“奇怪”。

printf "Please enter the ticket number:\t"; read vTICKET; vTICKET=$(printf %04d "$vTICKET"); printf "$vTICKET\n";

如果我072作为输入输入,这就是我看到的

Please enter the ticket number: 072
0058

我想知道是否有另一种方法可以让我对输入或命令更加宽容一些readprintf似乎是在不实际测试字符串长度的情况下添加前导零的很酷的方法。

答案1

输入值的前导零导致 shell 将其解释为八进制数。

您可以使用10#例如强制十进制转换

$ printf "Please enter the ticket number:\t"; read vTICKET; vTICKET=$(printf %04d "$((10#$vTICKET))" ); printf "$vTICKET\n";
Please enter the ticket number: 072
0072

请注意,在 bash 中,您可以使用例如直接将 a 的结果分配printf给变量-vprintf -v vTICKET %04d "$((10#$vTICKET))"

也可以看看如何阻止 Bash 解释八进制代码而不是整数?

答案2

在 Bash 中,您可以去掉任何前缀零。第一次设置后extglob

$ shopt -s extglob

您可以在参数扩展中使用*(0)after :##

$ read -r TICKET; printf "%.4d\n" "${TICKET##*(0)}"
000000000000000000000000000000000000072
0072

完成后,您可以使用以下命令恢复正常extglob

$ shopt -u extglob

现在*(0)再次进行基本路径名扩展:

$ read -r TICKET; printf "%.4d\n" "${TICKET##*(0)}"
asdfasdf(0)72
0072
$ read -r TICKET; printf "%.4d\n" "${TICKET##*(0)}"
asdfasdf072
bash: printf: asdfasdf072: invalid number
0000

相关内容