首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >bash中的printf:"09“和"08”是无效的数字,"07“和"06”是可以的

bash中的printf:"09“和"08”是无效的数字,"07“和"06”是可以的
EN

Stack Overflow用户
提问于 2011-11-10 18:34:57
回答 7查看 28.5K关注 0票数 35

这是我的bash脚本--我只想用零填充一组数字:

代码语言:javascript
复制
printf "%04d" "09"
printf "%04d" "08"
printf "%04d" "07"
printf "%04d" "06"

输出:

代码语言:javascript
复制
./rename.sh: line 3: printf: 09: invalid number 
0000
./rename.sh: line 4: printf: 08: invalid number 
0000 
0007
0006

什么……?

只有09和08导致了问题:在我的序列中,所有其他数字似乎都没问题。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-11-10 19:03:53

如果您的"09"在一个变量中,您可以这样做

代码语言:javascript
复制
a="09"
echo "$a"
echo "${a#0}"
printf "%04d" "${a#0}"

为什么这会有帮助?嗯,以0开头但第二位没有x的数字字面值被解释为八进制值。

八进制值只有数字0..789未知。

"${a#0}"剥离了一个领先的0。然后,可以将结果值提供给printf,它以0为前缀,以4位数适当地打印该值。

如果你希望得到像"009"这样的值,事情就会变得更复杂,因为你必须使用一个循环来消除开头所有多余的0,或者使用注释中提到的extglob表达式。

票数 38
EN

Stack Overflow用户

发布于 2012-08-04 06:47:02

(( 10#$var ))的数值算术计算语法(( ... ))可以使用以下语法转换为基数10 (因此可以确保正确解释)。或者,在原始数字的情况下:(( 10#08 ))。非常简单和干净,可以在任何你确定基数应该是10的地方使用,但不能保证前导零不包括在内。

因此,在您的示例中,它将如下所示:

代码语言:javascript
复制
printf "%04d\n" $(( 10#09 ))
printf "%04d\n" $(( 10#08 ))
printf "%04d\n" $(( 10#07 ))
printf "%04d\n" $(( 10#06 ))

生成以下输出:

代码语言:javascript
复制
0009
0008
0007
0006

使用这种语法,因为您将使用变量的值而不是变量本身,所以增量(( var++ ))和减量器(( var-- ))将不起作用,但仍然可以相对干净地分别实现为var=$(( 10#var + 1 ))var=$(( 10#var - 1 ))

我第一次遇到这个解决方案是here,但this answer to a similar Stack Overflow question也演示了它。

票数 26
EN

Stack Overflow用户

发布于 2011-11-10 18:36:03

以"0“开头的数字被视为八进制(即基数为8)。因此,"8“和"9”不是有效的数字。

参见http://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic

这种行为继承自C ++等语言。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8078167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档