【问题标题】:Passing sequential list to for loop [duplicate]将顺序列表传递给for循环[重复]
【发布时间】:2018-04-23 16:03:12
【问题描述】:

我有一个要通过 for 循环的文件列表。他们被命名

FA2_00032.png, FA2_00033.png, etc

我有变量 $imID 包含 FA2 字符串,$startFrame 包含开始帧(例如 00034)和 $endFrame 包含结束帧(例如 00894)。

我已经设法使用以下方法获取相关文件的列表:

eval echo ${imageID}_{${startFrame}..${endFrame}}.png;

这个输出

FA2_00034 FA2_00035 FA2_00036 等

但现在我需要将它传递给 for 循环。也就是说,

for file in *the above list*

其中*上面的列表*是上面的块引用列表。 $file 应包含 FA2_00034FA2_00035 等,以便在 for 循环中使用。

【问题讨论】:

  • 顺便说一句,这是BashPitfalls #33
  • 当心,链接副本中有一些错误的答案。
  • @CharlesDuffy, @chepner:你觉得用xargs 做这个怎么样? (例如seq ${startFrame} ${endFrame} | xargs -I {} printf "%s_%05d.png\\n" ${imageID} {})。似乎是不使用循环的好方法。
  • @l'L'l, seq 既不是 bash 的一部分,也不是 POSIX 规范的一部分。当它存在时,它不保证可用,也不保证有任何特定的行为。并且xargs printf,使用/usr/bin/printf,比使用printf shell 内置的要贵得多。
  • @CharlesDuffy:有趣的是,我没有意识到 xargs 实际上是在使用它自己的 printf — 一如既往地感谢您的回复/建议/提示!

标签: bash seq


【解决方案1】:

对于这样的任务,使用 C 风格的 for 循环,而不是 eval+{...}printf 可用于从当前整数组合文件名。语法 10#$foo 确保 $foo 的值在包含前导 0 时被视为十进制(而不是八进制)数字。

imageID=FA2
startFrame=00034
endFrame=00894

for ((i=10#startFrame; i<=10#$endFrame; i++)); do
    printf -v file '%s_%05d.png' "$imageID" "$i"
    echo "Operating on $file" >&2
done

【讨论】:

  • 效果很好 - 谢谢
猜你喜欢
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2013-10-25
  • 2017-03-04
  • 2020-12-13
相关资源
最近更新 更多