Bash 格式化字符串比格式化=$(printf…)更快?

Bash 格式化字符串比格式化=$(printf…)更快?,bash,Bash,我有一个变量$id,它是一个数字,例如51,我希望这个数字有11位数的基数,比如:00000000051 我试过printf: format=$(printf "% 011d" $id) 但是它大大减慢了我的程序的速度,除了printf还有其他方法更快吗 有什么想法吗 printf并不慢$()很慢。不要在可以避免的时候使用它;在这种情况下,避免命令替换需要使用printf-v传递要存储输出的变量的名称 printf -v format '%011d' "$id" 顺便说一句——在ksh93中

我有一个变量$id,它是一个数字,例如51,我希望这个数字有11位数的基数,比如:00000000051

我试过printf:

format=$(printf "% 011d" $id)
但是它大大减慢了我的程序的速度,除了printf还有其他方法更快吗


有什么想法吗

printf
并不慢<代码>$()很慢。不要在可以避免的时候使用它;在这种情况下,避免命令替换需要使用
printf-v
传递要存储输出的变量的名称

printf -v format '%011d' "$id"

顺便说一句——在ksh93中(与bash不同),
value=$(printf…
会自动进行优化,以直接将结果存储在值中,而无需分叉子shell,因此原始代码的速度会很快。

可能不理想,但它可以工作:

#/bin/bash

id=51
formatted=00000000000$id

# The space before the negation is required
echo ${formatted: -11}

给出的答案可能是最好的解决方案。我们只想添加这个链接,并举例说明将变量归零的其他方法
printf
也是“本机”——一个shell内置。(尽管必须承认,
-v
是一个扩展)。请注意这里的
(…)
只是多余的分组括号,而不是算术语句(这无论如何都是错误的;您需要的是算术表达式
$(…)
)。子字符串展开的参数已在算术上下文中求值<代码>${formatted:${#formatted}-11}就足够了。
${name:…}
已经是特定于bash的(或者至少是非标准的):)。在版本4.2中添加了对负偏移量的支持。非常切向,但是当我们讨论通过参数扩展来实现这一点时,对
printf
-样式格式的支持似乎是对
@
操作符的一个很好的添加。类似于
${id@F%011d}
@chepner是否有一种内联连接而不是单独分配的方法?