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