从我的bash shell我想用一个不同的编号参数调用一个程序n次,该参数必须是固定格式,如"%02i"
一种方法是:
for ((i=23; i<42;i++)); do sh ../myprogram `printf "%02i\n" $i` done
有没有办法改善这printf..
部分?我相信这可能是一个包含更多文件的性能瓶颈,并且使得该行的可读性低于内置函数(特别是在压缩为单行时).
在bash中,printf
由Shell(请参阅提供在bash(1)手册页,搜索的"printf"),所以你甚至没有的(最小的)的开销fork()
,并exec()
执行一个单独的命令-除非你运行它在反叛内.Bash的内置printf允许您使用-v
参数将输出分配给给定变量; 您的脚本片段可以重写为:
for ((i=23; i<42;i++)); do printf -v ii "%02i\n" $i sh ../myprogram $ii done
我不确定我是否认为比原版更具可读性.
脚本片段中资源最密集的部分是调用其他shell脚本; 我不担心调用printf的开销,除非进一步的证据表明不是这样.
编辑以添加反引号和直接执行之间的区别
您的号码已经有2位小数.为什么你需要使用printf呢?如果我没记错的话(这里没有测试shell),它只是在与这些标志一起使用时填充最多2位小数.就个人而言,我喜欢xargs:
seq 23 42 | xargs -n1 sh ../myprogram
您可以使用-w
参数for seq
,如果需要,可以使用零填充数字,因此它们具有相同的宽度.
事实证明seq
是Linux特定的.感谢Dave在评论中找出它(他的回答).printf
直接使用,无需循环:
printf '%02i\n' {23..42} | xargs -n1 sh ../myprogram
我喜欢使用xargs
,因为它允许轻松地并行运行命令达到某个限制,可以一次传递多个数字并允许其他灵活选项.和Dave一样,我建议你放弃sh
它,然后把它放到你的shell脚本中,作为第一行:
#!/bin/sh .....
然后只需执行你的东西
printf '%02i\n' {23..42} | xargs -n1 ../myprogram
这是更通用的,并允许您的脚本也被exec
C库调用调用(至少在Linux中,就是这种情况).