Bash:内联迭代多个值

Bash:内联迭代多个值

早晨,

我目前处于必须对多个数据集重复命令的情况,并且想知道是否有比嵌套循环或构建专用程序更优雅的解决方案。

基本上是这样的:

> 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 <

相关内容