2013-01-19 30 views
2

我不確定在標題和此問題中是否使用了正確的術語,因此如果它不正確,請對其進行編輯。三個變量的支撐範圍擴展

在bash腳本中,我有三個數組,dirs,filesextensions。我如何使所有包含dirs,然後files,然後extensions的值的字符串組合?

我不跟猛砸經驗可言,但我沒有嘗試這個,看看我能做到這一點,只有兩個數組:

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

我從這個例子想輸出是ac bc ad bd

編輯:我完全搞砸了這個例子,只是修復它,萬一你想知道發生了什麼。

回答

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

這隻適用於數組包含連續的字母序列 - 它適用於問題中的示例,但可能不適用於真正的應用程序。 –

+0

這將適用於支架擴展條件滿足的所有條件。如果gsingh2011的輸入滿足支撐擴展條件,那麼這是OK的。其他更好的使用循環。他還用'brace-expansion'標記了這個問題,因此我認爲這對他有幫助。 – Suku

+0

@ gsingh2011。總是試圖接受滿足您的要求的答案。積分就像所有在這裏積極回答的人的動機一樣。同樣在這種方式下,這個線程可以認爲是一個完成的。 – Suku

0

這是由@珠洲的回答啓發,但使用{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的答案。