这是我的bash脚本--我只想用零填充一组数字:
printf "%04d" "09"
printf "%04d" "08"
printf "%04d" "07"
printf "%04d" "06"
输出:
./rename.sh: line 3: printf: 09: invalid number
0000
./rename.sh: line 4: printf: 08: invalid number
0000
0007
0006
什么……?
只有09和08导致了问题:在我的序列中,所有其他数字似乎都没问题。
发布于 2011-11-10 19:03:53
如果您的"09"
在一个变量中,您可以这样做
a="09"
echo "$a"
echo "${a#0}"
printf "%04d" "${a#0}"
为什么这会有帮助?嗯,以0
开头但第二位没有x
的数字字面值被解释为八进制值。
八进制值只有数字0
..7
,8
和9
未知。
"${a#0}"
剥离了一个领先的0
。然后,可以将结果值提供给printf
,它以0
为前缀,以4位数适当地打印该值。
如果你希望得到像"009"
这样的值,事情就会变得更复杂,因为你必须使用一个循环来消除开头所有多余的0
,或者使用注释中提到的extglob
表达式。
发布于 2012-08-04 06:47:02
(( 10#$var ))
的数值算术计算语法(( ... ))
可以使用以下语法转换为基数10 (因此可以确保正确解释)。或者,在原始数字的情况下:(( 10#08 ))
。非常简单和干净,可以在任何你确定基数应该是10的地方使用,但不能保证前导零不包括在内。
因此,在您的示例中,它将如下所示:
printf "%04d\n" $(( 10#09 ))
printf "%04d\n" $(( 10#08 ))
printf "%04d\n" $(( 10#07 ))
printf "%04d\n" $(( 10#06 ))
生成以下输出:
0009
0008
0007
0006
使用这种语法,因为您将使用变量的值而不是变量本身,所以增量(( var++ ))
和减量器(( var-- ))
将不起作用,但仍然可以相对干净地分别实现为var=$(( 10#var + 1 ))
和var=$(( 10#var - 1 ))
。
我第一次遇到这个解决方案是here,但this answer to a similar Stack Overflow question也演示了它。
发布于 2011-11-10 18:36:03
以"0“开头的数字被视为八进制(即基数为8)。因此,"8“和"9”不是有效的数字。
参见http://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic。
这种行为继承自C ++等语言。
https://stackoverflow.com/questions/8078167
复制相似问题