我目前正在寻找以下代码的替代方案,该代码的工作原理稍微不那么“奇怪”。
printf "Please enter the ticket number:\t"; read vTICKET; vTICKET=$(printf %04d "$vTICKET"); printf "$vTICKET\n";
如果我072
作为输入输入,这就是我看到的
Please enter the ticket number: 072
0058
我想知道是否有另一种方法可以让我对输入或命令更加宽容一些read
?printf
似乎是在不实际测试字符串长度的情况下添加前导零的很酷的方法。
答案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
给变量-v
printf -v vTICKET %04d "$((10#$vTICKET))"
答案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