2011-03-18 70 views
1

我遇到了在bash腳本中聲明數組中所有可打印字符的問題。我想通過循環顯示所有可打印的字符4次。在bash變量/數組中使用特殊字符

array=(a b c d … z A B C … Z 1 2 3 … 0 ! @ # $ %^& * () _ +) 

For chr1 in ${array[@]} 
Do 
For chr2 in ${array[@]} 
Do 
Echo $chr1$chr2 
Done 
Done 

我已經能夠得到空格字符用$ {數組[空間值]}打印,但我還沒有能夠得到*字符打印。由於某種原因,它傾向於打印文件列表。

任何想法如何讓這個工作?

回答

3

行情!更多引號!

array=(a b c d z A B C Z 1 2 3 0 '!' '@' '#' '$' '%' '^' '&' '*' '(' ')' '_' '+') 

for chr1 in "${array[@]}" 
do 
    for chr2 in "${array[@]}" 
    do 
    echo "$chr1$chr2" 
    done 
done 

在你的周圍數組聲明中的特殊字符巴掌報價和巴掌雙引號中環周圍的變量訪問。

+0

單引號沒有工作和雙打沒有幫助。兩種方式的結果都一樣 – Grant 2011-03-22 06:00:44

3

在shell腳本中,引用是你的朋友。總是。

array=(a b c d e f g h i j k l m z A B C Z 1 2 3 0 \! \@ \# \$ \% \^ \& \* \(\) _ +) 
for chr1 in "${array[@]}"; do 
    for chr2 in "${array[@]}"; do 
    echo "$chr1$chr2" 
    done 
done 

這裏可以正常工作。

+0

由於某種原因,即使我用\「\ *」轉義*,它仍然會打印這些文件。 這可能是我使用Mac OS的問題嗎? – Grant 2011-03-22 05:06:44

0

*是bash的特殊字符。

百搭卡[星號]。 *字符用作通配符文件名擴展的「通配符」。它本身就匹配給定目錄中的每個文件名。

從絕對的bash腳本指南[1],你會想逃避它像第一個答案。

[1] http://tldp.org/LDP/abs/html/special-chars.html

+0

用\轉義*仍然打印我的目錄中的文件列表。 – Grant 2011-03-22 05:05:12

1
chr() { printf "\\$(($1/64*100+$1%64/8*10+$1%8))"; } 
ord() { printf '%s' "$(((256 + $(printf '%d' "'$1"))%256))"; } 

for i in {32..126} 
do 
    for j in {32..126} 
    do 
     chr $i; chr $j 
     echo 
    done 
done