bash for循环:仅在第一次迭代后执行某些操作

bash for循环:仅在第一次迭代后执行某些操作
for f in "$@"
do
  echo     # I'd like to skip this the first time
  echo $f
  print_info_about $f
done

这段 bash 脚本接受一些文件名并打印每个文件名及其相关信息,每个文件名之间有一个空行。
有什么干净的方法可以避免不必要的初始空行?
同样,有什么干净的方法可以echo在每次迭代之后(最后一次迭代除外)打印空行?

比分离中的第一个(或最后一个)项$@并使用对的额外调用更简洁print_info_about
理想情况下,就像 Ruby 将所有内容累积到字符串数组中然后一样简洁.join("\n")

答案1

separator=''
for f
do
  printf "$separator"
  separator='\n'
  echo "$f"
  print_info_about "$f"
done

这将separator='\n'在第二次迭代及以后的迭代中徒劳地调用。但赋值是在 shell 内部进行的,因此速度很快,性能不会受到影响。

问题已加标签bash,因此我修正了你的引用(未加引号的变量在 中表现良好zsh)。Solefor f相当于for f in "$@"


请注意,上述解决方案不是“仅在第一次迭代后执行某些操作”的通用方法。它是针对您的特定“操作”(打印空白行作为分隔符)量身定制的。

以下通用方法检查变量是否不为空并有条件地运行任意操作do_something

marker=''
for f
do
  if [ "$marker" ]; then
    do_something
  fi
  marker=whatever
  print_info_about "$f"
done

答案2

如果你不介意多留一个空行在最后一项之后,你可以这样做:

for f in "$@"; do
    printf '%s\n%s\n\n' "$f" "$(print_info_about "$f")"
done

相关内容