2017-08-08 78 views
0

我不知道該怎麼說它(我有一個時刻我忘記了一切),但是我想創建一個腳本,讓它給我所有可能由字符組成的單詞。如何從shell腳本獲取各種輸出?

例如,如果我想各種各樣的「空間」中,我可以輸入(s|S)/(p|P)/(A|a|4)/(C|c)/(e|3|E|ε)/(s|S|5|$)到腳本,作爲回報獲得類似這樣的輸出:

... 
sP4C3s 
SpaCe5 
spACεS 
Sp4C3$ 
... 

等等,等等。我怎麼能創造這個?

(試圖通過該途徑尋找這一點,但找不到任何幫助這可能是我的寫法是錯誤的。)

+0

排列組合...... –

回答

2

你會在bash使用brace expansion

echo {s,S}{p,P}{a,A}{c,C}{e,E}{s,S} 

空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間SPAC ES空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間空間艙間

如果你想要的話換行分隔,使用

printf "%s\n" {s,S}{p,P}{a,A}{c,C}{e,E}{s,S} 

爲了使這種可重複使用的,把它放在一個函數中。然而,由於大括號展開是由shell執行的第一個擴展,你不能用它的變量,而無需使用eval

casecombinations() { 
    local source brace_expr i char 
    for source in "[email protected]"; do 
     brace_expr="" 
     for ((i=0; i<"${#source}"; i++)); do 
      char="${source:i:1}" 
      case $char in 
       [[:alpha:]]) brace_expr+="{${char,},${char^}}";; 
       *) brace_expr+="\\$char";; 
      esac 
     done 
     eval echo "$brace_expr" 
    done 
} 
casecombinations hello world