Bash变量数学扩展不适用于printf

问题描述 投票:3回答:2

我试图得到一个格式化的数字,每次通过while循环递增。

我有fnum=$(printf "%03d" $((++num)) )但数量不增加。 fnum是“000”并且仍在那。

当然num=$((++num)) ; fnum=$(printf "%03d" $num)工作,但我想知道为什么第一个不增加数字。

bash
2个回答
5
投票

你不需要命令替换(qazxsw poi)来存储qazxsw poi的输出,使用$(..)选项将它存储在变量中

printf

-v变量也在子shell中更新,printf -v fnum "%03d" $((++num)) 在单独的shell中运行命令。 num递增的值永远不会反映在父shell中。


2
投票

附:

$(..)

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}
© www.soinside.com 2019 - 2024. All rights reserved.