我试图得到一个格式化的数字,每次通过while循环递增。
我有fnum=$(printf "%03d" $((++num)) )
但数量不增加。 fnum
是“000”并且仍在那。
当然num=$((++num)) ; fnum=$(printf "%03d" $num)
工作,但我想知道为什么第一个不增加数字。
你不需要命令替换(qazxsw poi)来存储qazxsw poi的输出,使用$(..)
选项将它存储在变量中
printf
-v
变量也在子shell中更新,printf -v fnum "%03d" $((++num))
在单独的shell中运行命令。 num
递增的值永远不会反映在父shell中。
附:
$(..)
num
中的命令在子shell中运行,因此更改为$(printf "%03d" $((++num)))
变量,而不会返回到父shell。
使用工作版本,$()
在当前shell的上下文中执行,因此num
被修改。
当然,回馈num=$((++num))
没有什么意义,因为num
的副作用无论如何都在改变num
,所以你可以这样做:
++
你可以完全避免启动一个子shell,只使用内部的num
东西,如果你需要做很多事情会产生很大的不同(a):
((++num)) ; fnum=$(printf "%03d" $num)
(a)如以下脚本所示:
bash
第一个片段需要9秒多的CPU时间(用户+系统)才能运行,第二个片段在大约一秒钟内完成(如果你测量挂钟时间,则差异更加明显,因为“子壳中的printf”有很多副本)需要开始):
((++num)) ; fnum=000${num} ; fnum=${fnum: -3} ; doSomethingWith ${fnum}