MacOS中文件重命名和printf与bash的交互
下面如何解释这些输出?为什么第二个命令将010替换为0008?也许我不明白bash的花括号语法是怎么回事:MacOS中文件重命名和printf与bash的交互,bash,Bash,下面如何解释这些输出?为什么第二个命令将010替换为0008?也许我不明白bash的花括号语法是怎么回事: $ BN=CF001; echo `printf CF%04d.conllu ${BN/CF/}` CF0001.conllu $ BN=CF010; echo `printf CF%04d.conllu ${BN/CF/}` CF0008.conllu 由于您在printf中使用了d修饰符(number),这将010解释为八进制数,因为它以0开头 八进制数010是十进制的8(以10为基
$ BN=CF001; echo `printf CF%04d.conllu ${BN/CF/}`
CF0001.conllu
$ BN=CF010; echo `printf CF%04d.conllu ${BN/CF/}`
CF0008.conllu
由于您在
printf
中使用了d
修饰符(number),这将010
解释为八进制数,因为它以0
开头
八进制数010
是十进制的8
(以10为基数)
您可以使用s
获得正确的输出:
BN=CF010; printf 'CF%04s.conllu\n' "${BN/CF/}"
CF0010.conllu
由于您在
printf
中使用了d
修饰符(number),这将010
解释为八进制数,因为它以0
开头
八进制数010
是十进制的8
(以10为基数)
您可以使用s
获得正确的输出:
BN=CF010; printf 'CF%04s.conllu\n' "${BN/CF/}"
CF0010.conllu
您可以强制
bash
将该值视为基数为10的数字:
$BN=CF010
$printf'%04d\n'${BN#CF}
0008
$printf'%04d\n'$((10#${BN#CF}))
0010
您可以强制bash
将该值视为基数为10的数字:
$BN=CF010
$printf'%04d\n'${BN#CF}
0008
$printf'%04d\n'$((10#${BN#CF}))
0010
我发现一个类似于@anubhava的解决方案是使用f
:
$ BN=CF010; echo `printf CF%04.f.conllu ${BN/CF/}`
CF0010.conllu
我发现一个类似于@anubhava的解决方案是使用
f
:
$ BN=CF010; echo `printf CF%04.f.conllu ${BN/CF/}`
CF0010.conllu
你能给我一个bash教程或文档,教我所有这些修饰符和
和{}
操作符吗?
操作符记录在手册页的算术求值下。请注意,{}
不是运算符${BN#CF}
在算术展开之前展开为数值文本$(…)
将10#…
计算为基数为10的文本。手册中的一段摘录:“否则,数字的形式为[base#]n,其中可选的基数是一个介于2和64之间的十进制数字,表示算术基数,n是该基数中的一个数字。”但为什么会使用${BN#CF}
和${BN/CF/}
进行扩展呢?如果它不是运算符,它是什么?首先进行参数扩展,将$((10#${BN#CF}))
转换为$((10#010))。接下来,算术展开将看到表达式
10#010',并将其正确地解析和计算为基数为10的数字文字。没有{…}
操作;只有。#${…}
。你能给我指一个bash教程或文档,教我所有这些修饰符和#
和#{}
操作符吗?#
操作符记录在手册页的算术求值下。请注意,{}
不是运算符${BN#CF}
在算术展开之前展开为数值文本$(…)
将10#…
计算为基数为10的文本。手册中的一段摘录:“否则,数字的形式为[base#]n,其中可选的基数是一个介于2和64之间的十进制数字,表示算术基数,n是该基数中的一个数字。”但为什么会使用${BN#CF}
和${BN/CF/}
进行扩展呢?如果它不是运算符,它是什么?首先进行参数扩展,将$((10#${BN#CF}))
转换为$((10#010))。接下来,算术展开将看到表达式
10#010',并将其正确地解析和计算为基数为10的数字文字。没有{…}
操作;只有。#${…}
。