MacOS中文件重命名和printf与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为基

下面如何解释这些输出?为什么第二个命令将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为基数)

您可以使用
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的数字文字。没有
{…}
操作;只有
。#${…}