当前位置:  开发笔记 > 编程语言 > 正文

格式化命令的bash变量

如何解决《格式化命令的bash变量》经验,为你挑选了2个好方法。

从我的bash shell我想用一个不同的编号参数调用一个程序n次,该参数必须是固定格式,如"%02i"

一种方法是:

for ((i=23; i<42;i++)); do 
    sh ../myprogram `printf "%02i\n" $i`
done

有没有办法改善这printf..部分?我相信这可能是一个包含更多文件的性能瓶颈,并且使得该行的可读性低于内置函数(特别是在压缩为单行时).



1> Commodore Ja..:

在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> Johannes Sch..:

您的号码已经有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

这是更通用的,并允许您的脚本也被execC库调用调用(至少在Linux中,就是这种情况).

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有