支撑范围扩展三个变量

时间:2013-01-19 03:46:08

标签: bash brace-expansion

我不确定我是否在标题和问题中使用了正确的术语,因此如果不正确,请对其进行编辑。

在bash脚本中,我有三个数组,dirsfilesextensions。如何制作包含dirsfiles,然后extensions的值的字符串的所有组合?

我根本没有使用Bash的经验,但我确实试过这个,看看我是否只用两个数组来实现这个目标:

$ echo ${dirs[@]}
a b
$ echo ${files[@]}
c d
$ echo ${dirs[@]}{${files[@]}}
a bc d

此示例中我想要的输出是ac bc ad bd

编辑:我完全搞砸了这个例子并修好了,万一你想知道发生了什么。

3 个答案:

答案 0 :(得分:4)

您无法使用{foo,bar}语法执行此操作; bash只会扩展,如果它在大括号之间看到 literal 逗号。 (我想你可以使用eval,但这会带来它自己的混乱。)

只需使用循环:

for dir in "${dirs[@]}"; do
    for file in "${files[@]}"; do
        for ext in "${extensions[@]}"; do
            echo "$dir$file$ext"
        done
    done
done

答案 1 :(得分:0)

以下内容适用于满足大括号扩展条件的所有条件

$ dirs=(a b)
$ files=(c d)

$ eval echo {${dirs[0]}..${dirs[$((${#dirs[@]}-1))]}}{${files[0]}..${files[$((${#files[@]}-1))]}}
ac ad bc bd

为了您的理解:

$ A=`echo {${dirs[0]}..${dirs[$((${#dirs[@]}-1))]}}`
$ B=`echo {${files[0]}..${files[$((${#files[@]}-1))]}}`
$ echo $A$B
{a..b}{c..d}
$ eval echo $A$B
ac ad bc bd

答案 2 :(得分:0)

这是受@ Suku的回答启发,但使用{a,b,c} - 样式扩展而不是{a..c}

$ dirs=(this/ that/)
$ files=(a b c)
$ extensions=(.c .h)
$ saveIFS=$IFS
$ IFS=,
$ eval echo "{${dirs[*]}}{${files[*]}}{${extensions[*]}}"
this/a.c this/a.h this/b.c this/b.h this/c.c this/c.h that/a.c that/a.h that/b.c that/b.h that/c.c that/c.h
$ IFS=$saveIFS

请注意,与几乎所有涉及eval的内容一样,如果任何数组值具有错误的元字符,则可能会发生灾难性故障。如果这是一个问题,请改用@ Eevee的答案。