早晨,
我目前处于必须对多个数据集重复命令的情况,并且想知道是否有比嵌套循环或构建专用程序更优雅的解决方案。
基本上是这样的:
> echo "Hello from [NYC,Chicago] to [Berlin,Paris]"
Hello from NYC to Berlin
Hello from NYC to Paris
Hello from Chicago to Berlin
Hello from Chicago to Paris
当然,一些“for i in x,y,z
魔法”会起作用,但一旦涉及多个数据集,就会变得很难阅读。
有没有办法在 Bash 中轻松迭代多个数据集?您将如何解决这个问题以使其保持一定的可读性?
答案1
使用括号扩展。
printf '%s\n' 'Hello from '{NYC,Chicago}' to '{Berlin,Paris}
请注意,它不适用于变量,仅适用于文字值(因为括号扩展发生在变量扩展之前)。
答案2
如果是一次性快速行动,那么括号扩展会快速而简单。如果您正在寻找一种编程变体,那么几个循环可能更合适。
示例 1,使用非常短的数据集
# Iterate until done
for colour in red green blue
do
for shape in square triangle circle
do
printf "> %s - %s <\n" "$colour" "$shape"
done
done
示例 2,具有更大的数据集
# Prepare the scenario with two files, "colourfile" and "shapefile"
cat >colourfile <<'X'
red
green
blue
X
cat >shapefile <<'X'
square
triangle
circle
X
# Loop until done
while IFS= read -r colour
do
while IFS= read -r shape
do
printf "> %s - %s <\n" "$colour" "$shape"
done <shapefile
done <colourfile
这将读取shapefile
中的每个条目一次colourfile
。幸运的是,磁盘缓存将有助于减轻重复的 I/O。如果您真的担心,那么将内部文件读入数组将用磁盘访问换取内存使用。
两个示例的输出
> red - square <
> red - triangle <
> red - circle <
> green - square <
> green - triangle <
> green - circle <
> blue - square <
> blue - triangle <
> blue - circle <