2

我不确定我是否在标题和这个问题中使用了正确的术语,所以如果不正确,请编辑它。

在 bash 脚本中,我有三个数组,dirs,filesextensions. 如何制作包含来自dirs、 thenfiles和 then的值的所有字符串组合extensions

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

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

我想从这个例子中得到的输出是ac bc ad bd

编辑:我完全搞砸了这个例子并修复了它,以防你想知道发生了什么。

4

3 回答 3

4

你不能用{foo,bar}语法来做到这一点;bash 仅在看到大括号之间的文字逗号时才会扩展它。(我想你可以使用eval,但这会带来自己的混乱。)

只需使用循环:

for dir in "${dirs[@]}"; do
    for file in "${files[@]}"; do
        for ext in "${extensions[@]}"; do
            echo "$dir$file$ext"
        done
    done
done
于 2013-01-19T03:52:58.360 回答
0

这受到@Suku 的回答的启发,但使用{a,b,c}-style 扩展而不是{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 的答案。

于 2013-01-19T04:48:26.290 回答
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
于 2013-01-19T04:08:18.560 回答