2014-12-26 65 views
1

我有一些代碼(Bash腳本.sh),它產生了不同的字符組合。Bash腳本:逃逸的明星角色

當變量「chars」包含具有「\」(*)的星號時,將生成一個帶有斜線和星號的字符串。但是當我刪除星號前面的斜線時,會拋出一串文件名。

有沒有人有任何想法如何我可以生成正確的字符串與明星?

min_length="1" 
max_length="2" 
chars="\` ~ ! @ # $ %^& \* () - _ = + [ { ] } \ | ; : ' \" , <.>/?" 

generateCombinationsOfString() { 

    for c in $chars; do 

     nc=$[$nc+1] 
     ch[$nc]=$c 
    done 

    for x in `seq 1 $[$max_length+1]`; do 

     if [ $min_length -ge $x ]; then 
      ci[$x]=1 
     else 
      ci[$x]=0 
     fi 
    done 

    for clen in `seq $min_length $max_length`; do 

      while [ ${ci[$[$clen+1]]} -ne 1 ]; do 
        wrd="" 

        for x in `seq $clen -1 1`; do 
         wrd=$wrd${ch[${ci[$x]}]} 
        done 

        echo "${wrd}" 

        ci[1]=$[${ci[1]}+1] 

        for x in `seq 1 $clen`; do 

          if [ ${ci[$x]} -gt $nc ]; then 
           ci[$x]=1 
           ci[$[$x+1]]=$[${ci[$[$x+1]]}+1] 
          fi 
        done 
      done 
    done 
} 

generateCombinationsOfString 
+0

會是怎樣爲你一個「正確的字符串」? – emecas

回答

3

的問題是在以下循環

for c in $chars ; do 

比照

chars='1 2 * 3' 
for c in $chars ; do 
    echo "$c" 
done 

路徑名擴展發生在變量擴展後。

爲了防止這種情況,使用數組:

#! /bin/bash 
chars=(1 2 \* 3) 
for c in "${chars[@]}" ; do 
    echo "$c" 
done 
+0

不錯!非常,非常感謝! –