【问题标题】:Brace range expansion of three variables三个变量的大括号范围扩展
【发布时间】:2013-01-19 03:46:08
【问题描述】:

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

在 bash 脚本中,我有三个数组,dirsfilesextensions。如何使包含dirsfilesextensions 中的值的所有字符串组合?

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

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

我想要的这个例子的输出是ac bc ad bd

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

【问题讨论】:

    标签: bash brace-expansion


    【解决方案1】:

    你不能用{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
    

    【讨论】:

      【解决方案2】:

      这是受@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 的答案。

      【讨论】:

        【解决方案3】:

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

        $ 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
        

        【讨论】:

        • 这仅适用于数组包含连续字母序列的情况——它适用于问题中的示例,但可能不适用于实际应用程序。
        • 这将适用于满足大括号扩展条件的所有条件。如果 gsingh2011 的输入满足大括号扩展条件,则可以。其他明智的做法是更好地使用 for 循环。他还用brace-expansion 标记了这个问题,因此我认为这会对他有所帮助。
        • @gsingh2011 。始终尝试接受满足您要求的答案。对于所有在这里积极回答的人来说,积分就像是动力。同样以这种方式,该线程可以视为已完成。
        猜你喜欢
        • 1970-01-01
        • 2013-01-25
        • 2012-04-12
        • 2018-09-05
        • 1970-01-01
        • 2013-10-26
        相关资源
        最近更新 更多